2

我是编程新手,我不明白垃圾收集是如何工作的。在以下示例中:

import Tkinter as tk

a = 0

class Object1:

    def __init__(self):
        global a
        a = tk.Frame()
        a.pack()
        b = tk.Button(a, text="click me", command=self.callback)
        b.pack()

    def callback(self):
        print "clicked!"
        program = Object2()

class Object2:

    def __init__(self):
        global a
        a.destroy()
        a2 = tk.Frame()
        a2.pack()
        b = tk.Label(a2, text='This is the second object.')
        b.pack()



program = Object1()

tk.mainloop()

Object1 的实例“program”是否保留在末尾?我是否必须以某种方式明确删除它?如果我多次重复这个结构,每个 Objectx 都有一个按钮,它会破坏前一帧并添加一个包含新内容的新帧,随着程序的进行,这会消耗越来越多的内存吗?谢谢你的帮助。

4

2 回答 2

3

a将引用一个“销毁”tk.Frame

为了允许tk.Frame被垃圾收集,您需要删除对它的引用

一种方法是设置a = None另一种方法是del a

当然,当程序真正结束时,一切都被释放了

于 2012-05-10T01:33:10.803 回答
0

所以......如果你是编程新手,你绝对不需要考虑垃圾收集。

首先,您需要了解变量作用域在 Python 中是如何工作的。基本 - 在某个块(选项卡级别)中声明的变量不会离开该块。模块全局变量是在第一个选项卡级别定义的变量(例如您的示例中的 a )。模块(文件)之间可访问的真正全局变量需要这样声明。不仅如此 - 但不要忘乎所以。阅读本文末尾的链接以获取更多详细信息。

其次,您开始陷入过早优化的模式。您是否经历过导致您出现问题的过度内存使用?如果是这样,那么只有那时,您才需要找出一种隔离变量范围的方法(例如,在每次迭代的 for 循环体中)。在开始担心性能之前让代码做你想做的事,然后只花时间改变对速度(运行最多的最大循环)或内存(浪费的变量使用)有很大影响的事情。

第三,垃圾收集在语义上不相关,变量范围是。Python 并不擅长管理内存,事实就是如此。例如,字典对象的大小不会减小,即使您填充它然后设法删除所有项目;此外,当字典容器需要增长时,它只会增加一倍(即500M-->1G-->2G)。但不要让这吓到你——它实际上很少是一个问题。

查看SaltyCrane关于变量范围的博客。

于 2012-05-10T04:59:55.910 回答