2

Pythonオブジェクトがガベージコレクションの候補になる時期を正確に把握しようとしています。私はいくつかのドキュメント/投稿を読みましたが、明確な答えを見つけることができませんでした.

たとえば、次の行を見てください。これが foo への最後の参照です。foo が指すオブジェクトがガベージ コレクションに使用できるのはいつですか?

ret = func(['xyz: ' + foo.name])

(可能な)個々のステップに分解します:

  1. name への一時参照が作成されます。
  2. 「xyz:」は名前と連結され、値が返されます。
  3. リストは新しい文字列で作成されます。
  4. 関数は新しい配列で呼び出されます。
  5. 関数が戻ります。
  6. 結果は ret に割り当てられます。
  7. 次の命令…

オブジェクトが最初に収集される資格があるのは、どの 2 つのステップの間ですか? オブジェクトへの参照カウントがデクリメントされるのはいつですか?

手順のリストが不完全/不正確な場合もお知らせください。参照する可能性のある回答の共通の出発点を与えるために、それらを列挙しようとしただけです。

4

2 に答える 2

4

他のガベージ コレクション言語と同様に、経験則は次のとおりです。つまり、プログラム (その一部) がまだアクセスできる限り、gc を実行してはなりません。後は正攻法です。それが実際に再利用されるかどうかは、完全に実装次第です。

あなたの例ではfoo、プログラムが後のステートメントで引き続きオブジェクトを使用できるため、名前はオブジェクトを存続させます。(理論的には、実装は変数が使用されなくなったかどうかを検出し、その参照を削除する可能性があります。おそらく、オブジェクトがすぐに到達不能になる可能性があります。実際には、JIT コンパイラによってコンパイルされた一部のトレースを除いて、これは Python では不可能です。) リスト、対照的に、 が到達可能な場所 (到達可能なオブジェクトの属性やグローバル変数など) に参照を格納していないfunc場合は、 の実行後または実行中に到達不能になる可能性があります。func

オブジェクトとそれが参照するオブジェクトを混同することに注意してくださいfoo。これは、ガベージ コレクションについて推論するときに致命的です。object はありません。特定の時点で参照さfooれるオブジェクトが存在するだけですfoo(したがって、特定の時点で参照されるオブジェクトのセット)。これは重要です:

  • foo別のオブジェクトを参照するように変更される可能性があり、最初に参照していたオブジェクトに到達できなくなる可能性があります。両者を区別しない限り、そのような状況について話すことはできません。
  • 指しているオブジェクトへの他の多くの参照が存在する可能性がありますfoo(実際にはかなり可能性があります)。fooスコープの外に出たり、 にフィードされdelたり、別のオブジェクトを参照するように変更されたりした後も、オブジェクトが存続している可能性があります。
于 2012-12-03T19:34:25.373 に答える
2

変数へのすべての参照が範囲外になるか、手動で削除されるとすぐに、変数はガベージ コレクションの対象になります ( del x)。

あなたの例では、fooこの行の前に存在する必要があります(それ以外の場合は aNameErrorです)。したがって、この後も参照が存在するため、サンプルコードブ​​ロックでガベージコレクションされることはありません。この後に呼び出す場合del fooでも、ガベージ コレクションを行うには、オブジェクトへの参照が他にないと想定する必要があります。

于 2012-12-03T19:26:35.150 に答える