2016-05-25 3 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) 

ここで私は、私は、各Greek()インスタンスに3 weakref秒を含めることを期待することWeakSet weak_sを持っており、それがない:

>>> 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

@ user2357112申し訳ありません、編集済みです。 (途中でFooに変わってしまった)。 –

+0

実際の通訳セッションからコードと結果をコピーして貼り付けてください。質問ボックスに出力を再入力したり、手動で修正して見つかったエラーを修正したりしないでください。コードの実際の動作を隠すだけです。 – user2357112

答えて

2

あなたはまだここからobj変数を持っている:

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

変数はループからその最後の値を保持し、それはまだ生きているとWeakSetでそれを維持、最後Greekインスタンスを参照するということ。

+0

もちろん、ガー。ありがとう、愚かな質問。 –

関連する問題