32

Pythonの公式ドキュメントを調べましたが、参照サイクルが何であるかがわかりません。私はGCモジュールを理解しようとしているので、誰かが私にとってそれが何であるかを明確にしてください。返信ありがとうございます。

4

4 に答える 4

31

参照サイクルとは、単に1つ以上のオブジェクトが相互に参照していることを意味します。たとえば、依存関係を表す矢印を使用して紙に描画すると、サイクルが表示されます。

(ほぼ)最も単純な参照サイクルは、2つのオブジェクトaを持ちb、それらが相互に参照することです。

a.other = b
b.some_attr = a

ナイーブなガベージコレクターは、オブジェクトが別のオブジェクトによって参照されているかどうかに厳密に依存します。この場合、abが他に参照されていない場合でも、それらは相互に参照し、ナイーブなガベージコレクターはメモリを再利用できない可能性があります。(ただし、Pythonが参照サイクルによってトラップされる可能性があるかどうかはわかりません。)

編集:最も単純な参照サイクルは、それ自体を参照するオブジェクトです。

a = []
a.append(a)
于 2012-03-28T15:30:27.277 に答える
15

これは参照サイクルです。

l = []
l.append(l)

の最初の要素l、つまり、は、それ自体l[0]への循環参照になりました。l

于 2012-03-28T15:29:56.077 に答える
12
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]

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

>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
于 2013-01-22T06:16:23.840 に答える
3
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>> 

ここで、変数xはそれ自体を参照しています。これは参照サイクルと呼ばれます。

于 2012-03-28T15:31:31.073 に答える