2009-10-29 82 views
16

有什麼辦法可以手動刪除垃圾收集拒絕擺脫的對象,即使我打電話給gc.collect()?在Python 3.0中工作Python中的手動垃圾收集

+1

不知道Python,但有些垃圾收集器有時會錯誤地認爲事物仍在使用中,因爲他們發現*出現*是引用這些對象(但實際上不是)。在這種情況下,你可以做的事情不多。 – Artelius 2009-10-29 05:37:29

+1

另外,您應該儘快轉移到Python 3.1。 3.0有一些已知的問題,不再支持。 – 2009-10-29 07:12:31

+2

只要我完成榮譽,我打算。 – Casebash 2009-10-29 09:07:54

回答

24

the docsgc.get_referrers(thatobject)會告訴你爲什麼對象還活着(做一個gc.collect()之後,以確保不想要的「活躍度」會持續)。之後,這是某種黑色藝術;-)。你會經常發現一些引用者是列表(所以爲什麼這個列表指的是thatobject?你可以.remove它在緊急模式下,但使正常代碼的聲音更好......),更常見的是, (其中許多可能是__dict__ s的某些類別實例或其他 - 往往不是無足輕重以找出哪一個...再一次,蠻力拆除有時是一種便捷的緊急解決方案,但從來沒有一個可持續的遠程解決方案! - )。

1

這取決於你的Python運行的是什麼。 Here's good article解釋細節

報價:

在CPython中的當前版本,每一個新的分配x的循環中會釋放先前分配的資源。使用GC,這不能保證。如果你想編寫能夠與任何Python實現一起工作的代碼,你應該明確地關閉資源;這將工作不管GC:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

如果GC拒絕銷燬它,這是因爲你有一個引用它的地方。擺脫參考,它會(最終)去。例如:

myRef = None 

請記住,GC可能不一定摧毀你的目標,除非它需要。

如果你的對象所持有的資源不在Python的管理之下(例如,一些C代碼調用的詭計),對象應該提供一個資源釋放調用,所以你可以在需要時執行它,而不是在Python決定時。

4

del或者None是你只有朋友

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

不一定正確。該對象只需要無法訪問(或者有一個合意的一次性可重複計數,這非常有希望與前者一致)有資格進行回收。 – 2009-10-29 05:17:59

+5

'del a'不會刪除該對象(只是一個註釋;並不意味着您暗示) – hasen 2009-10-29 05:25:57