2013-01-31 18 views
0

在這個例子中:爲什麼循環引用會阻止不在循環中的對象的析構函數?

class Foo(object): 
    def __del__(self): 
     print "Foo died" 

class Bar(object): 
    def __init__(self): 
     self.foo = Foo() 
     self.baz = Baz(self) 

class Baz(object): 
    def __init__(self, bar): 
     self.bar = bar 

b = Bar() 

我期望的富析構函數,儘管酒吧和巴茲之間的循環被調用,因爲作爲持有富對任何酒吧或巴茲加以收集和遞減引用計數的引用在收集Foo之前​​應該完全安全。爲什麼python不這樣做?如果可以阻止析構函數被其他類的完全不相關的動作阻止,析構函數可能會有用嗎?

+0

爲什麼'foo',如果它被引用刪除? –

+2

簡單答案:析構函數沒有用。 –

+0

相關問題:http://stackoverflow.com/q/2428301/10077 –

回答

1

請注意,析構函數。

快速修改腳本和所有的作品如你預期:

class Foo(object): 
    def __del__(self): 
     print "Foo died" 

class Bar(object): 
    def __init__(self): 
     self.foo = Foo() 
     self.baz = Baz(self) 

class Baz(object): 
    def __init__(self, bar): 
     self.bar = bar 

b = Bar() 

del b 
+0

哦!那麼現在我覺得愚蠢。我認爲它和我沒有'self.baz'這行的時候一樣。謝謝,當時間限制結束時將標記爲已接受。 –