Pythonのクラスとクラス属性はいつガベージコレクションされるのか?寿命の仕組みを解説
Pythonにおいて、クラス属性の寿命は「その属性への最後の参照が消えた瞬間」までです。これはグローバル変数とまったく同じ挙動であり、どちらもプログラム全体の実行期間中ずっと存在し続けることが保証されているわけではありません。
クラス属性の寿命は「最後の参照」まで
Pythonは基本的に参照カウント方式でオブジェクトを管理しています。クラス属性も例外ではなく、その属性値への参照がすべてなくなった時点で、ガベージコレクション(GC)による回収の対象となります。
同様に、グローバル変数も最後の参照がなくなるまで存在します。つまり、「グローバル変数だから必ずプログラム終了まで生きている」という思い込みは誤りだという点に注意が必要です。
モジュールスコープで定義されたクラスの扱い
モジュールのトップレベル(モジュールスコープ)で定義されたクラスは、実質的にグローバル変数の一種です。したがって、その場合のクラス本体およびクラス属性の寿命は、通常のグローバル変数と同一になります。
ただし、たとえモジュールスコープで定義されていても、del文で明示的に削除したり、同名の変数に別のオブジェクトを代入して参照を上書きしたりすれば、元のクラスへの参照は失われます。参照が失われれば、その時点で回収の可能性が生じます。
インスタンスが存在しなければGCされる可能性がある
現在そのクラスのインスタンスが1つも生きておらず、クラス自体への参照(変数名、リストや辞書などのコンテナからの参照、他モジュールからの参照など)の参照カウントがゼロになれば、クラス本体とそのクラス属性はガベージコレクションによって回収され得ます。
逆に言えば、どこか一箇所でも参照が残っている限り、クラスとその属性はメモリ上に存続し続けます。「インスタンスがない=すぐに消える」のではなく、「参照もない=初めて消え得る」と考えるのが正確です。
補足:循環参照と世代別GC
参照カウントだけでは、オブジェクト同士が相互に参照し合う「循環参照」を回収できません。そのためPythonには、循環参照を検出・回収する世代別GC(標準ライブラリのgcモジュール)も備わっています。クラス、関数、インスタンスなどが複雑に参照し合う構造の場合は、この仕組みが回収を担当します。
まとめ
- クラス属性は、最後の参照が消えるまで存在する
- グローバル変数も同様に、最後の参照が消えるまで存在する
- モジュールスコープで定義されたクラスは、グローバル変数と同じ寿命を持つ
- インスタンスが存在せず、クラス自体の参照カウントがゼロになれば、クラスとクラス属性はGCで回収され得る
-
Pythonの文字クラス操作とは?正規表現での積集合・差集合・和集合を解説
文字クラス操作とは 一部の正規表現エンジンでは、文字クラスの中で高度な演算を行うことができます。これにより、単純な文字の並びや範囲指定にとどまらず、より柔軟なパターンマッチングが可能になります。主な操作は以下の3つです。 差集合(減算):あるクラスには属するが、別のクラスには属さない文字にマッチさせる 積集合(交差):複数のクラスのどちらにも属する文字にマッチさせる 和集合(結合):複数のクラスのいずれかに属する文字にマッチさせる 積集合(AND演算) AND演算子 && を使うと、複数のクラスの積集合を指定できます。[…&&[…]] という形式で記述し、
-
Python正規表現の文字クラス(文字セット)とは?基本の使い方を解説
文字クラスとは「文字クラス」または「文字セット」とは、角括弧 [ ] で囲まれた文字の集合のことです。正規表現エンジンは、文字クラス内に含まれる複数の文字のうち、いずれか1文字にマッチします。マッチさせたい文字を角括弧の中に記述します。たとえば、母音のいずれかにマッチさせたい場合は、[aeiou] という文字セットを使用します。文字クラスがマッチするのは常に「1文字」だけである点に注意してください。また、文字クラス内の文字の並び順は結果に影響しません。[aeiou] と [uoiea] はまったく同じ意味になります。文字クラス内でハイフン(-)を使うと、文字の範囲を指定できます。たとえば [0