16

私はPythonのための公式文書を見てきましたが、私は参照サイクルが何かを見つけることができないようです。私はGCモジュールを理解しようとしているので、誰もが私のために何を明確にしてください。あなたの返信を先にありがとう。Pythonのリファレンスサイクルとは何ですか?

答えて

15

参照サイクルは単に参照する1つ以上のオブジェクトを意味します。つまり、依存関係を表す矢印付きの用紙に描画すると、サイクルが表示されます。

a.other = b 
b.some_attr = a 

ナイーブガベージコレクタはオブジェクトが他のオブジェクトによって参照されているか否かのオフ厳密動作:

(ほぼ)最も単純な基準周期は、互いに参照する2つのオブジェクトabを有しています。この場合、abの両方が参照されていない場合、それらは依然として互いに参照し、ナイーブなガベージコレクタはメモリを再利用できません。 (Pythonはいえ、参照サイクルによりトラップできるかどうかはわからない。)

EDITを:今ここ

a = [] 
a.append(a) 
10

これは基準サイクルである:

l = [] 
l.append(l) 

lの最初の要素、すなわちl[0]は、今l自体に環状の参照です。

3
>>> x=[1,2,3] 
>>> x.append(x) 
>>> x 
[1, 2, 3, [...]] 
>>> 

:最も単純な基準サイクルは、それ自体を参照するオブジェクトであります変数xはそれ自体を参照していますが、これは参照サイクルと呼ばれます。

7
>>> aRef = [] 
>>> aRef.append(aRef) 
>>> print aRef 
[[...]] 

これは、aRefという名前の変数によって参照されるリストオブジェクトを作成します。リストオブジェクト内のfirst elementは、それ自体への参照です。この場合、リストオブジェクトに対してdel aRef参照を逆参照aRefとします。しかし、リスト・オブジェクトの参照カウントはゼロまで減少せず、リスト・オブジェクトは依然として自身を参照しているので、リスト・オブジェクトはガベージ・コレクションされない。この場合、Pythonのガベージコレクタは循環参照が存在するか定期的にチェックし、インタプリタはそれを収集します。以下は、循環参照オブジェクトが使用する空間を手動で収集する例です。

>>> import gc 
>>> gc.collect() 
0 
>>> del aRef 
>>> gc.collect() 
1 
>>> gc.collect() 
0 
関連する問題