標籤:就刪除 引用 為什麼 print span 操作 font 沒有 記憶體回收
python的記憶體回收採用的是引用計數機製為主和分代回收機製為輔的結合機制,當對象的引用計數變為0時,
對象將被銷毀,除瞭解釋器預設建立的對象外。(預設對象的引用計數永遠不會變成0)
所有的計數引用+1的情況:
一.對象被建立:
1.a = 23
這裡23這個對象並沒有在記憶體中建立,因為在Python啟動解譯器的時候會建立一個小整數池,-5~256之間的這些對象
會被自動建立載入到記憶體中等待調用;a = 23是為23這個整數對象增加了一個引用。
執行代碼:
>>> import sys>>> a = 23>>> sys.getrefcount(a)
結果:15
23這個整數對象目前有15個引用。
2.MyName()
class MyName(object):
pass
以上,如果對象被建立後沒有引用操作,此時的引用計數是0,MyName()本身不是一個引用。
print(sys.getrefcount(MyName()))
結果:1
說明:之所以結果為1,是因為sys.getrefcount(MyName())函數也算一個引用。
二.對象被引用;
a = 23345455b = ac = bprint(sys.getrefcount(b))print(sys.getrefcount(c))
結果:4,4
說明:每一次賦值都會增加資料操作的引用次數,要記住引用的是變數a,b,c等指向的資料23345455,而不是變數本身。
三.對象被作為參數,傳入到一個函數中;
# 增加了一個引用a = 23345455# 增加了一個引用b = a# 增加了一個引用c = b# 增加了一個引用print(sys.getrefcount(b)) # 執行完畢後引用銷毀,減少一個引用# 增加了一個引用print(sys.getrefcount(c))
說明:以上代碼,賦值操作為資料增加了3個引用,sys.getrefcount(b)也增加了一個引用;
那為什麼sys.getrefcount(c)的結果還是4呢?這是因為當函數執行後,作為參數的引用會自動銷毀,所以print(sys.getrefcount(b))在執行完畢後引用就刪除了。
四.對象作為一個元素,儲存在容器中;
# 增加了一個引用a = 23345455# 增加了一個引用b = alist = [a, b] # 增加了2個引用print(sys.getrefcount(b)
結果:5
另外還有所有的引用計數減1的情況:python的計數引用分析(二)
python的計數引用分析(一)