2012-11-25 80 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,這是對實例的引用爲好,但主要是它是提供了參考方法包裝。