Python实例删除

2024-03-29 06:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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都有一个按钮,它会破坏前一个帧并添加一个新的内容,那么随着程序的进行,它会消耗越来越多的内存吗?谢谢你的帮助。在


Tags: textselfa2initdef编程callbackprogram
2条回答

所以。。。如果你是一个编程新手,你完全不需要考虑垃圾收集。在

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

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

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

签出变量作用域上的SaltyCrane's blog。在

a将引用“已销毁”tk.Frame

要允许对tk.Frame进行垃圾回收,需要删除对它的引用

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

当然,当程序实际结束时,所有的都会被释放

相关问题 更多 >