3

つまり、Python Essential Reference、4ed。言う:

a = {}
b = {}
a['b'] = b
b['a'] = a
del a
del b

メモリリークが発生し、インタプリタはaとbを削除するために循環検出アルゴリズムを必要とします。ただし、refcountがどのようになっているのかを調べようとすると、最終的にaとbのrefcountが両方ともゼロになるため、循環検出アルゴリズムは必要ありません。好き:

a = {}
b = {}

refcounts:a = 1、b = 1

a['b'] = b
b['a'] = a

refcounts:a = 2、b = 2

del a

refcounts:b ['a'] = 1、b = 1

del b

refcounts:a = 0、b = 0

refcountsの私の理解の何が問題になっていますか?

4

2 に答える 2

4

del a変数が指すオブジェクトを破棄せ、現在の名前空間からa変数を削除するだけです。aこの後、dictは存続し(他のdictはまだそれを参照しているため)、したがって、2番目のdictを参照しbます。同様に、del b最初のdictのrefcountがゼロにならないようにします。これは、最初のdictが有効である限り、2番目のdictを参照するため、一方を削除できず、もう一方を有効に保つためです。申し訳ありませんが、これは紛らわしいように聞こえます。これをどのように配置するかはよくわかりません。

結局、次のようになります(かさばるボックスはオブジェクト、矢印は参照):

 ┌──────────┐    ┌──────────┐
 │  dict 1  │    │  dict 2  │
 │          │ ◀──┤  key 'a' │
 │  key 'b' ├──▶ │          │
 └──────────┘    └──────────┘
于 2010-12-11T12:12:31.460 に答える
3

Pythonには、しばらくの間(2.3以降)サイクリックgcがあります。ただし、gcモジュールをインポートして、サイクリックgcを調整することは可能です(無効にすることもできます)。

于 2010-12-11T12:12:41.727 に答える