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 回答