Pythonオブジェクトがガベージコレクションの対象になるタイミングとは?参照カウントの仕組みを解説
Pythonオブジェクトはいつガベージコレクションの候補になるのか
Pythonにおいて、オブジェクトや変数がガベージコレクション(GC)の候補になるのは、そのオブジェクトへの参照がすべて無効になった瞬間です。具体的には、以下のようなケースが該当します。
- オブジェクトへのすべての参照がスコープ外に出たとき
del xのように手動で参照を削除したとき- 変数に別のオブジェクトを再代入し、元のオブジェクトへの参照が失われたとき
重要なのは、プログラム内のどこからもそのオブジェクトが参照されていない状態にならなければ、ガベージコレクションの対象にはならないという点です。一箇所でも参照が残っていれば、オブジェクトはメモリ上に保持され続けます。
参照カウントによる仕組み
CPython(標準のPython実装)では、主に参照カウント方式によってメモリ管理が行われています。各オブジェクトは「自分を参照している数」を内部的にカウントしており、このカウントがゼロになった時点で、そのオブジェクトは即座に破棄(解放)されます。
コード例で確認する
a = [1, 2, 3] # リストオブジェクトの参照カウント: 1
b = a # 参照カウント: 2
del a # 参照カウント: 1(まだ b が参照しているため解放されない)
del b # 参照カウント: 0 → ここでGCの対象となる
このように、最後の参照が消えたタイミングで初めてオブジェクトは回収可能な状態になります。
循環参照と世代別ガベージコレクタ
参照カウント方式だけでは解決できないのが循環参照の問題です。互いに参照し合うオブジェクト同士は、外部からの参照がなくなってもカウントがゼロにならないため、メモリに残り続けてしまいます。
この問題に対処するため、Pythonには世代別ガベージコレクタ(gcモジュール)が組み込まれており、定期的に到達不可能な循環参照を検出して回収します。
まとめ
Pythonのオブジェクトがガベージコレクションの候補になる条件は、「すべての参照がスコープ外になるか、明示的に削除されて、どこからも参照されなくなったとき」です。CPythonでは参照カウントが即座に解放を担い、循環参照は世代別GCが補完するという二段構えの仕組みでメモリ管理が実現されています。
-
コインを三角形に配置したときの最大の高さを求めるPythonプログラム
本記事では、N枚のコインを三角形の形に配置したときに達成できる最大の高さを求めるPythonプログラムについて詳しく解説します。 問題文 N枚のコインが与えられ、それらを三角形の形に並べることを考えます。具体的には、1段目に1枚、2段目に2枚、3段目に3枚というようにコインを積み上げていきます。このとき、N枚のコインで作ることができる三角形の最大の高さ(段数)を求めて表示する必要があります。 解法のアプローチ 高さhの三角形を作るために必要なコインの総数は、等差数列の和の公式より次のように表されます。 1 + 2 + 3 + … + h = h(h+1)/2 ≤ N これを整理すると二次不
-
Pythonの関数はオブジェクトなのか?属性を持たせる方法を解説
Pythonの関数はオブジェクトである結論から言うと、Pythonの関数は完全なオブジェクトです。def文やlambda式を使うと、Pythonは自動的に関数オブジェクトを生成します。通常のオブジェクトと同様に、関数にも属性(アトリビュート)を持たせたり、後から参照したりすることができます。さらに、関数の中にはデータ変数だけでなく、別の関数を定義することも可能です。サンプルコード以下の例では、def文で作成した関数に「score」という属性を代入し、その値を取得しています。また、lambda式で生成したオブジェクトの型も確認しています。def foo(): pass foo.score = 2