2017-07-20 22 views
2

我在tuple內有一個非常大的對象,我想明確地刪除它。不幸的是,由於元組是不可變的,只是在做del tup[0]拋出:Python:刪除從元組引用的對象

TypeError: 'tuple' object doesn't support item deletion 

我實際上並不需要tup可言了,所以我可以刪除整個事情,我只是想確保大對象從引用立即刪除tup而不等待垃圾收集器。

將剛剛刪除tup立即刪除它還是有更好的方法嗎?

+1

'del'語句不*立即回收內存。 –

+0

這是哪個版本的Python?例如內存管理Jython將與CPython完全不同,內存回收的細節取決於運行時的版本。 –

回答

4

del確實不是回收內存。它不是刪除的對象。取決於您是否刪除索引(如del somelist[0]),屬性(如del foo.attr)或變量(如del foo)。

del減量基準計數器,並且如果參考計數器降爲零,存儲器將被回收,通常立即。

但是,如果有循環引用,垃圾收集器必須走過去除它們。所以,如果你確實需要刪除與元組中的大對象,你可以使用:

import gc 

del tup 
gc.collect() 

請注意,如果其他項目是指大對象,它仍然不會被刪除。所以請確保只有一個參考。

對於沒有特殊del ete過程的簡單變量(有些類似於關閉文件),del將因此從本地範圍中刪除該變量,並將引用計數設置爲比之前減少一個。這通常會比將變量設置爲None更快,因爲在後一種情況下,它會增加單身人士的參考計數None