Python中的垃圾回收是以引用計數爲主,分代收集爲輔。html
引用計數的缺陷是循環引用的問題。python
在Python中,若是一個對象的引用數爲0,Python虛擬機就會回收這個對象的內存。web
對象被建立:x=4svg
另外的別人被建立:y=x函數
被做爲參數傳遞給函數:foo(x)spa
做爲容器對象的一個元素:a=[1,x,’33’]code
一個本地引用離開了它的做用域。好比上面的foo(x)函數結束時,x指向的對象引用減1。xml
對象的別名被顯式的銷燬:del x ;或者del yhtm
對象的一個別名被賦值給其餘對象:x=789對象
對象從一個窗口對象中移除:myList.remove(x)
窗口對象自己被銷燬:del myList,或者窗口對象自己離開了做用域。
class A(object):
def __init__(self):
print("A.__init__")
def __del__(self):
print("A.__del__")
>>>a = A()
A.__init__
>>>b = a
>>>c = { "a": b }
>>>print( id(a), id(b), id(c["a"]) )
(1395581109401, 1395581109401, 1395581109401)
>>>del a
>>>del b
>>>c.clear()
A.__del__
根據上面的這個例子咱們能夠看到,只有在對象引用數變爲0以後,系統會將在內存中建立的對象回收,這個時候纔會調用del函數