>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a と b はおそらくガベージ コレクションですか、それとも a と b はガベージ コレクションである必要がありますか? それを証明する方法は?
>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a と b はおそらくガベージ コレクションですか、それとも a と b はガベージ コレクションである必要がありますか? それを証明する方法は?
Python変数は、オブジェクトを参照する単なる名前です。この例では、整数4、5、6の3つのオブジェクトがあります。
整数6はaによって参照され、5は最初にbによって参照され、4はcとdの両方によって参照されます。次に、を呼び出しますdel(b)
。これにより、整数5から参照が削除されます。したがって、この時点では、6と4は引き続き参照されますが、5は参照されません。
ガベージコレクションがどのように処理されるかは、実装の詳細です。
今ここを見てください:
現在の実装では、-5〜256のすべての整数の整数オブジェクトの配列が保持されます。その範囲で整数を作成すると、実際には既存のオブジェクトへの参照が返されます。
したがって、この例で使用した番号がガベージコレクションされることはありません。
ごみがいつ収集されるかについては、次のドキュメントに記載されていますgc.set_threshold(threshold0, threshold1, threshold2)
。
いつ実行するかを決定するために、コレクターは、最後の収集以降のオブジェクトの割り当てと割り当て解除の数を追跡します。割り当ての数から割り当て解除の数を引いた数がthreshold0を超えると、収集が開始されます。最初は、世代0のみが検査されます。世代1が検査されてから世代0がthreshold1を超えて検査された場合、世代1も検査されます。同様に、threshold2は、世代2を収集する前の世代1の収集数を制御します。
しきい値の標準値は次のとおりです。
In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)
CPython は参照カウントを使用します。Jython と IronPython は、基盤となる VM の GC を使用します。そうは言っても、CPython はコードで使用されているものを含む小さな整数をインターンするため、それらは特に GC されることはありません。
ガベージ コレクションの仕組みは、実装の詳細です。質問「<a href="http://docs.python.org/2/faq/programming.html#my-class-defines-del-but-it-is-not-called-when-i- __del__
Python FAQ のdelete-the-object" rel="nofollow">クラスで定義していますが、オブジェクトを削除しても呼び出されません。
CPython では、参照カウントがデフォルトです。これは、最後の参照が削除された瞬間にオブジェクトが削除されることを意味します。a
そのため、現在のスコープでのみ参照されている というオブジェクトがある場合、del a
はそれを完全に削除します。
ただし、CPython は循環オブジェクトのリストも維持して、参照カウントが失敗する特殊なケースに対処します。このリストにあるオブジェクトがいつ削除されるかはわかりませんが、最終的には削除されます。
他の Python 実装では、すべてのdel a
オブジェクトに対して完全なガベージ コレクターが存在する可能性があるため、実際にオブジェクトを削除することに頼るべきではありません。.close()
これは、プログラムがシャットダウンするまでリソースがリークするのを防ぐために、ファイル記述子を常に手動で閉じる必要がある理由でもあります。