python的計數引用分析(一)

來源:互聯網
上載者:User

標籤:就刪除   引用   為什麼   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的計數引用分析(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.