2016-05-25 4 views
0

Я решил, что должен познакомиться с 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, и он сохраняется, похоже, независимо от того, что я делаю.

+0

Откуда взялось 'Foo'? – user2357112

+0

@ пользователь2357112 извините, отредактирован. (Снова перешел на Foo). –

+0

Скопируйте и вставьте свой код и получите результат фактической сессии переводчика. Не пытайтесь повторно вводить вывод в поле вопроса или редактировать его вручную, чтобы «исправить» пятнистые ошибки; вы просто затушевываете фактическое поведение вашего кода. – user2357112

ответ

2

У вас еще есть переменная obj здесь:

>>> for obj in objs: weak_s.add(obj) 

Эта переменная сохраняет свое последнее значение из цикла, так что она по-прежнему ссылаясь на последний Greek например, держа его в живых и в WeakSet.

+0

Конечно, га. Большое спасибо, глупый вопрос. –