2012-11-25 82 views
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的垃圾收集器的竞争条件是即将收集对象实例?
对对象功能的引用是否节省了一天的时间?
解释器是否保持对其当前正在执行代码的对象的引用,直到它完成?

回答

6

没有,没有任何这样的竞争状态。您正在清除参考,因此一旦删除方法参考,参考计数就会降至1,并清除对象

the_deletion_func引用指向一个方法,它指向实例(以及类),所以仍然有一个引用。

当前正在执行的方法有一个局部变量self,这是对实例的引用为好,但主要是它是提供了参考方法包装。