Pythonの公式ドキュメントを調べましたが、参照サイクルが何であるかがわかりません。私はGCモジュールを理解しようとしているので、誰かが私にとってそれが何であるかを明確にしてください。返信ありがとうございます。
4 に答える
参照サイクルとは、単に1つ以上のオブジェクトが相互に参照していることを意味します。たとえば、依存関係を表す矢印を使用して紙に描画すると、サイクルが表示されます。
(ほぼ)最も単純な参照サイクルは、2つのオブジェクトa
を持ちb
、それらが相互に参照することです。
a.other = b
b.some_attr = a
ナイーブなガベージコレクターは、オブジェクトが別のオブジェクトによって参照されているかどうかに厳密に依存します。この場合、a
とb
が他に参照されていない場合でも、それらは相互に参照し、ナイーブなガベージコレクターはメモリを再利用できない可能性があります。(ただし、Pythonが参照サイクルによってトラップされる可能性があるかどうかはわかりません。)
編集:最も単純な参照サイクルは、それ自体を参照するオブジェクトです。
a = []
a.append(a)
これは参照サイクルです。
l = []
l.append(l)
の最初の要素l
、つまり、は、それ自体l[0]
への循環参照になりました。l
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]
これにより、 という名前の変数によって参照されるリスト オブジェクトが作成されますaRef
。first element
リスト オブジェクト内の は、それ自体への参照です。この場合、リスト オブジェクトへのdel aRef
逆参照です。aRef
ただし、リスト オブジェクトはまだそれ自体を参照しているため、リスト オブジェクトの参照カウントは 0 に減少せず、リスト オブジェクトはガベージ コレクションされません。この場合、Python のガベージ コレクターはそのような循環参照が存在するかどうかを定期的にチェックし、インタープリターがそれらを収集します。以下は、循環参照オブジェクトによって使用されるスペースを手動で収集する例です。
>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>>
ここで、変数x
はそれ自体を参照しています。これは参照サイクルと呼ばれます。