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 = 23345455 b = a c = b print(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 = a list = [a, b] # 增加了2個引用 print(sys.getrefcount(b)
結果:5
另外還有所有的引用計數減1的情況:python的計數引用分析(二)