Python проблема создания объектов с использованием цикла - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в python, и пока я изучал книгу под названием Python GUI cookbook, я наткнулся на фрагмент кода, который я не до конца понимаю:

enter image description here

В строках с 95 по 98 автор создает цикл для создания объектов радиокнопки из библиотеки Tkinter.

В предыдущих уроках я узнал о сборке мусора.Поэтому в следующей итерации цикла, когда радиокнопка будет заменена, я ожидаю, что предыдущая кнопка будет возвращена сборщиком мусора.

Как все эти три остаются существующими, если они утилизируются мусоромколлекция?

1 Ответ

0 голосов
/ 06 декабря 2018

Это действительно вопрос о реализации 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...