2011-03-13 56 views
1

有沒有什麼辦法可以確保當一個對象被刪除時,它會從任何地方被完全刪除?Python中的對象刪除總數

例如,如果你不喜歡的東西:

A = NewObject() 
B = NewObject() 
C = NewObject() 

List1 = [A,B,C] 
List2 = [1,2,3,C] 

del A 
del List2[3] 

,並已刪除的對象無論他們在哪裏,這意味着List1將只包含B和那List2將只包含1,2,3。

有什麼辦法可以達到與此類似的行爲嗎?

+0

我已經接受了我所有的問題已經收到了回答這個問題的答案所有答案 – Hugoagogo 2011-04-04 13:14:02

回答

4

在某些情況下,您可以使用weak references。如果你不關心中的C是否處於活動狀態,那麼可以將其包裝在weakref中,並且當從List1到C的引用期滿時,垃圾收集器將收集與其關聯的所有內存。

Python使用引用計數來決定是否應該收集對象,因此只要引用被保存在某處,就不能完全刪除該對象。但是,如果weakref包裝對象,則不會計算該引用。所以當計數降到0時,它將在GC方便的時候收集。

請確保完全閱讀文檔,因爲有相當多的警告與weakrefs相關。特別是有資格在weakref內使用的對象的類型。

編輯:

一個例子 -

>>> class List(list): 
...  pass 
... 
>>> weaklist = List() 
>>> weaklist.append('a') 
>>> weaklist.append('b') 
>>> stronglist = [ ['c','d','e'] ] 
>>> weaklist 
['a', 'b'] 
>>> stronglist 
[['c', 'd', 'e']] 
>>> import weakref 
>>> stronglist.append(weakref.ref(weaklist)) 
>>> stronglist 
[['c', 'd', 'e'], <weakref at 0x10046e578; to 'List' at 0x100455f70>] 
>>> stronglist[1]() 
['a', 'b'] 
>>> del weaklist 
>>> stronglist 
[['c', 'd', 'e'], <weakref at 0x10046e578; dead>] 
>>> stronglist[1]() 
>>> 

我強烈建議閱讀weakrefs整個文檔。這聽起來像你想建立一個節點結構,但能夠從管理器引用該節點結構。您將創建節點作爲常規對象,但將弱參數放置到Manager中的這些對象。這樣,當一個節點被移除時,管理器內的引用就會死亡。

這可能是weakref模塊中定義的WeakValueDictionary

+0

這看起來像是正確的方向,但我不能讓它工作,因爲它是在文檔中解釋,即http://pastebin.com/BsximMga是否有任何確定性當垃圾收集器將運行 – Hugoagogo 2011-03-13 02:34:04

+0

@Hugo時,請參閱我的編輯。實際上你需要爲你想要過期的東西創建一個weakref包裝器。 – 2011-03-13 03:01:22

+0

非常好的答案,很好的解釋謝謝tonns – Hugoagogo 2011-03-13 04:05:48

2

不是,你是deleting a name,而不是實際的對象。當只有一個名字被刪除時,沒有理由或機制導致對象被銷燬(和其他名稱被刪除)。

+0

我知道它只是刪除名字就是爲什麼我問是否有任何方式的功能可以實現 – Hugoagogo 2011-03-13 02:21:05

1

不要試圖做到這一點,它將無法正常工作。以不再需要對象時自動刪除的方式構建程序。

也許你想釋放一些你的對象使用的外部資源。不要使用對象刪除(__del__不是解構器!) - 使用上下文管理器協議(又名with語句)來代替。我真的不能想到任何其他的原因來嘗試這...

+0

的原因,我試圖做到這一點是,在我正在研究的程序中,我有一個節點系統,它由一個總體管理器類,一個節點類和一個鏈接類組成,我有問題,試圖刪除一個鏈接仍然會引用它在經理和點對象等地方 – Hugoagogo 2011-03-13 02:33:06