2

面接でよく聞かれる質問はこれだと思います。

class A:
     def __init__(self, name):
          self.name = name
     def __del__(self):
          print self.name,

aa = [A(str(i)) for i in range(3)]
for a in aa:
    del a

そして、このコードの出力とその理由。出力は何もありませんが、なぜですか? それは、a がリスト内のオブジェクトの ref であり、次に del メソッドを呼び出して、この ref を削除するがオブジェクトを削除しないためですか?

4

3 に答える 3

5

参照するオブジェクトへの参照が少なくとも2つありますa(変数はオブジェクトへの参照であり、オブジェクト自体ではありません)。リスト内に1つの参照があり、次に参照" a"があります。をdel a実行すると、1つの参照(変数a)が削除されますが、リスト内の参照は削除されません。

また、Pythonはそれが呼び出されることを保証しないことにも注意してください__del__...

于 2012-08-16T15:44:39.927 に答える
4

__del__オブジェクトが破棄されたときに呼び出されます。これは、オブジェクトへの最後の可能な参照がプログラムのアクセス可能なメモリから削除された後に発生します。実装に応じて、これはすぐに発生する場合もあれば、しばらくしてから発生する場合もあります。

コードaは実行スコープからローカル名を削除するだけです。オブジェクトはリストに残るため、引き続きアクセスできます。del aa[0]たとえば、書いてみてください。

于 2012-08-16T15:45:59.210 に答える
3

ドキュメントから:

del x は直接呼び出さないことに注意してくださいx.__del__()— 前者は x の参照カウントを 1 減らし、後者は x の参照カウントがゼロに達したときにのみ呼び出されます。

__del__ガベージ コレクターが破棄するオブジェクトを検出したときにトリガーされます。ガベージ コレクターは、参照カウントが 0 のオブジェクトを破棄しようとします del。ローカル名前空間のラベルを分離するだけで、インタープリター内のオブジェクトの参照カウントが減少します。ガベージ コレクターの動作は、大部分がインタープリターの実装の詳細と見なされるため、__del__オブジェクトが特定の順序で呼び出されるという保証はなく、まったく呼び出されないという保証もありません。そのため、このコードの動作は未定義です。

于 2012-08-16T16:04:54.217 に答える