python-垃圾回收機制

說明

Python中的垃圾回收是以引用計數爲主,分代收集爲輔。html

引用計數的缺陷是循環引用的問題。python

在Python中,若是一個對象的引用數爲0,Python虛擬機就會回收這個對象的內存。web

引用計數

引用計數增長

  1. 對象被建立:x=4svg

  2. 另外的別人被建立:y=x函數

  3. 被做爲參數傳遞給函數:foo(x)spa

  4. 做爲容器對象的一個元素:a=[1,x,’33’]code

引用計數減小

  1. 一個本地引用離開了它的做用域。好比上面的foo(x)函數結束時,x指向的對象引用減1。xml

  2. 對象的別名被顯式的銷燬:del x ;或者del yhtm

  3. 對象的一個別名被賦值給其餘對象:x=789對象

  4. 對象從一個窗口對象中移除:myList.remove(x)

  5. 窗口對象自己被銷燬:del myList,或者窗口對象自己離開了做用域。

與內置函數del的關係

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函數

參考資料:Python垃圾回收機制詳解

參考資料:python的內存管理機制