7

Pythonインタープリターは、オブジェクトインスタンスがそれ自体への最後の参照を削除する場合を適切に処理しますか?

次の(明らかに役に立たない)モジュールについて考えてみます。

all_instances = []

class A(object):
    def __init__(self):
        global all_instances
        all_instances.append(self)

    def delete_me(self):
        global all_instances
        self.context = "I'm still here"
        all_instances.remove(self)
        print self.context

そして今の使用法:

import the_module
a = the_module.A()
the_deletion_func = a.delete_me
del a
the_deletion_func()

これでも出力されますI'm still hereが、オブジェクトインスタンスを収集しようとしているPythonのガベージコレクターとの競合状態はありますか?
オブジェクトの関数への参照は日を節約しますか?
インタプリタは、コードが現在実行されているオブジェクトへの参照を、終了するまで保持しますか?

4

1 に答える 1

6

いいえ、そのような競合状態はありません。参照をクリアしているため、参照カウントは1に下がり、メソッド参照を削除するとオブジェクトがクリーンアップされます

参照はthe_deletion_func、インスタンス(およびクラス)を指すメソッドを指しているため、そこにはまだ参照があります。

現在実行中のメソッドには、インスタンスへの参照でもあるローカル変数selfがありますが、ほとんどの場合、その参照を提供するのはメソッドラッパーです。

于 2012-11-25T14:47:38.227 に答える