2017-07-12 7 views
-1

私はPythonに新しく、先ほどPython delメソッドを見つけたので、次のコードの出力に疑問があります。「対話モード」と「スクリプトモード」のPython __del__メソッドの出力

class Robot(): 
    def __init__(self, name): 
     print(name + " has been created!") 

    def __del__(self): 
     print ("Robot has been destroyed") 

if __name__ == "__main__": 
    x = Robot("Tik-Tok") 
    y = Robot("Jenkins") 
    z = x 
    z 
    x 
    del x 
    del z 
    del y 

ケース1:

ので、スニペットコードは次のようなものになり、私は「スクリプトモード」でコードを実行した場合、次の出力が得られます。

Tik- Tokが作成されました! ジェンキンスが作成されました!ことは、なぜ私の質問をされて

>>> x = Robot("Tik-Tok") 
Tik-Tok has been created! 
>>> y = Robot("Jenkins") 
Jenkins has been created! 
>>> z = x 
>>> z 
<__main__.Robot object at 0x02D7E910> 
>>> x 
<__main__.Robot object at 0x02D7E910> 
>>> del x 
>>> del z 
>>> del y 
Robot has been destroyed 

:私は「対話モード」でコードを実行した場合、次の出力が得られます: ロボットが ロボットが

ケース2を破壊された破壊されています「ロボットが破壊されました」はケース2(対話モード)で1回だけ印刷され、ケース1(スクリプトモード)では2回印刷されます。 私はガベージコレクションに関するいくつかの調査を行いました。私の理解に基づいて、del xdel zのステートメントの後で、Robotオブジェクトのrefcountは0になり、その後__del__メソッドも同様にトリガーされますか? (del yステートメントの2番目の__del__メソッドがトリガされる直前)

+0

Do.Not.Implement。 '__del__'です。ほとんど*確かに*有用ではなく、メモリーリークを引き起こす可能性が非常に高いです。 –

+0

また、あなたのインデントは何ですか? – patrick

答えて

2

対話型インタープリタでは、評価された最後の式の結果は_として保存されます。この参照は、別の文がインタプリタに入力されるまで、Tik-Tokを生きています。

関連する問題