2017-09-12 7 views
0

以下のコードをREPLで実行すると、手動で行った後でもこの問題が表示されます。gc.collect() weakrefオブジェクトが引き続き表示されます。強い参照が削除されたとマニュアルGCが行われているが、なぜ私はまだこれを見ていたら、理想的にはweakrefをクリアしなければならない手作業によるGCC収集後でもウィークリファレンスがREPLで削除されない

[67]: from weakref import WeakValueDictionary 

class A: 
    def __init__(self): 
     self.val = 1 


a = A() 

w = WeakValueDictionary() 

w['k1'] = a 

dict(w) 
Out[72]: {'k1': <__main__.A at 0x1e59e9b84a8>} 

del a 

gc.collect() 
Out[74]: 239 

dict(w) 
Out[75]: {'k1': <__main__.A at 0x1e59e9b84a8>} 

の下を参照してください。

答えて

0

IPythonを使用しているようです。 the docsで説明したように、IPythonは各出力を番号付きグローバル変数に格納します。したがって、グローバル変数_72は、dict(w)(出力された値はOut[72])への参照を保持しています。これはもちろん、以前はaと呼ばれていたオブジェクトに対して強いリフェンスを含んでいます。

関連する問題