关于使用循环创建对象的python问题

时间:2018-12-05 23:46:55

标签: python tkinter

我是python的新手,在学习一本名为python GUI Cookbook的书时, 我遇到了一段我不太了解的代码:

enter image description here

在95至98行中,作者创建了一个循环,用于从Tkinter库制作单选按钮的对象。

在上一课中,我了解了垃圾回收。因此,我希望在循环的下一次迭代中,当单选按钮被替换时,前一个按钮将被垃圾回收回收。

如果通过垃圾回收将它们全部回收,它们三个如何保持存在?

1 个答案:

答案 0 :(得分:0)

这真的是有关Tkinter实施的问题。

您是正确的,GC会在下一次迭代中收集对象, UNLESS 别的东西也在引用该对象。我不读Tkinter代码库的假设是,当您将win传递给Radiobutton()时,该对象会将自身添加到win中,该对象现在保留了对您对象的引用。

此附加参考信息可防止GC收集您的对象。

OpenSource的优点在于您可以自己寻找:

https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/tkinter/init.py#L2285

BaseWidget__init__中要做的最后一件事(self.master是您的win自变量):

self.master.children[self._name] = self

这类似于:

foo = []

for x in range(3):
    tmp = dict(bar=x)
    foo.append(tmp)

tmp被重新分配,但是基础对象的引用已添加到foo中。