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