2016-08-31 40 views
3

所以我很好奇,可以說我有一個類如下什麼時候我應該在Python中使用del?

class myClass: 
    def __init__(self): 
     parts = 1 
     to = 2 
     a = 3 
     whole = 4 
     self.contents = [parts,to,a,whole] 

有加線

del parts 
del to 
del a 
del whole 

在構造函數中或將這些變量的內存範圍進行管理的任何benifit ?

+4

沒有。只要構造函數返回,解釋器就會自動釋放一旦超出範圍的變量。 'del'很少有用。 –

+0

從來沒有,垃圾收集 – PYPL

+0

相關:http://stackoverflow.com/questions/34430314/python-lifetime-memory-scope-of-local-variables-inside-a-function –

回答

8

從來沒有,除非你對內存和做一些很龐大的很緊。如果你正在編寫通常的程序,垃圾收集器應該處理所有事情。

如果你寫的東西笨重,你應該知道del不會刪除該對象,它只是取消引用它。即變量不再指向存儲對象數據的內存中的位置。之後,它仍然需要通過垃圾回收器進行清理,以釋放內存(這會自動發生)。

還有一種方法可以強制垃圾收集器清理對象 - gc.collect(),這在運行del後可能會有用。例如:

import gc 
a = [i for i in range(1, 10 ** 9)] 
... 
del a 
# Object [0, 1, 2, ..., 10 ** 9 - 1] is not reachable but still in memory 
gc.collect() 
# Object deleted from memory 

更新:在評論確實很好的說明。注意其他對內存中對象的引用。例如:

import gc 
a = [i for i in range(1, 10 ** 9)] 
b = a 
... 
del a 
gc.collect() 

該塊的執行後,大陣列仍然通過b可達並且將不會被清除。

+0

+1,這是對局部變量使用'del'的錯誤原因的一個很好的解釋。通過回答摘要中的問題可以進一步改進,當'del'被假設*被使用時(例如刪除列表中的東西,字典,刪除屬性...)。 – user4815162342

+4

「del」刪除對值的引用:如果該值除了要刪除的引用之外還有其他引用,它將繼續存在。因此,除非您確定沒有其他參考,否則您無法真正將「del」視爲釋放內存。 – kindall

-1

一種用途是從字典中刪除特定的鍵。

>>>> food = {"apple": True, "banana": False} 
>>>> del food['banana'] 
>>>> import json 
>>>> json.dumps(food) 
'{"apple": true}' 

我在將它們轉換爲JSON之前一直用它來清理字典。

+2

是的這不是我的問題的重點,感謝閱讀至少標題壽... – kpie

相關問題