私はこれを行う場合は、次のPythonにスタックベースの変数がありますか?
「」FOOを出た直後にdef foo():
a = SomeObject()
を破壊していますか?それとも、GCが起こるのを待っていますか?
私はこれを行う場合は、次のPythonにスタックベースの変数がありますか?
「」FOOを出た直後にdef foo():
a = SomeObject()
を破壊していますか?それとも、GCが起こるのを待っていますか?
はい、いいえ。 fooを離れるとオブジェクトは破棄されますが(他には何も参照されていない限り)、即時であるかどうかは実装の詳細であり、変更されます。
CPython(標準的なPython実装)では、refcountingが使用されるため、アイテムはすぐに破棄されます。オブジェクトに周期的な参照が含まれている場合や、参照が囲まれているフレームに保持されている場合(例:フレームの変数への参照を保持する例外が発生した場合)など、いくつかの例外があります。
Jythonただし、ガベージコレクタが起動するまで、オブジェクトはファイナライズされません。
このように、オブジェクトのタイムリーなファイナライズに頼るべきではありません。最後の参照が行きます。レキシカルスコープに基づいていくつかのクリーンアップを行う必要がある場合は、明示的にクリーンアップメソッドを呼び出すか、python 2.6の新しいwith statement( "from __future__ import with_statement
"で2.5で利用可能)を参照してください。
+1:変数aはすぐに削除される名前空間にあります。これは、参照カウントを減らすものです。変数はスタック状の構造で存在します。基本的なオブジェクトはそうではありません。 –