Я решил, что должен познакомиться с weakref
library, так что я начал возиться с коллекциями, думал, что до этого добрался.Почему мой WeakSet пуст после удаления единственной ссылки?
>>> import weakref
>>> class Greek():
def __init__(self, name):
self.name = name
>>> objs = [Greek('alpha'), Greek('gamma'), Greek('zeta')]
>>> weak_s = weakref.WeakSet()
>>> for obj in objs: weak_s.add(obj)
Здесь у меня есть WeakSet weak_s
, что я бы ожидать, чтобы содержать 3 weakref
с для каждого Greek()
экземпляра, и это делает:
>>> weak_s.data
{<weakref at 0x02ECA690; to 'Greek' at 0x02E5FF90>,
<weakref at 0x02ECA720; to 'Greek' at 0x02E5FFB0>,
<weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}
Тогда я бы ожидать, что как только я избавлюсь от имя objs
, не будет более «сильных ссылок» на каждый экземпляр Greek()
, и они будут собираться мусором. Но почему-то этого не происходит.
>>> del objs
>>> weak_s.data
{<weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}
Почему в моей системе WeakSet все еще есть слабое звено? Я могу снова использовать del
, и он сохраняется, похоже, независимо от того, что я делаю.
Откуда взялось 'Foo'? – user2357112
@ пользователь2357112 извините, отредактирован. (Снова перешел на Foo). –
Скопируйте и вставьте свой код и получите результат фактической сессии переводчика. Не пытайтесь повторно вводить вывод в поле вопроса или редактировать его вручную, чтобы «исправить» пятнистые ошибки; вы просто затушевываете фактическое поведение вашего кода. – user2357112