1. 程式人生 > >雲計算Python自動化:內部的引用計數

雲計算Python自動化:內部的引用計數

雲計算

Python內部記錄著所有使用中的對象有多少引用。一個內部跟蹤變量,稱為一個引用計數器。當對象被創建時,就創建了一個引用計數,當這個對象不再需要時,也就是說,這個對象的引用計數變為0時,它被垃圾回收。(這個只是形象的說一下,並不是嚴格的100%正確,但是通俗的理解往往是最好的學習方式)

增加引用計數:

當對象被創建並(將其引用)賦值給變量時,該對象的引用技術就是被設置為1。 當同一個對象的應用或者是對象又被賦值給其他變量時,或者作為參數傳遞給函數,方法或類實例時,或者被賦值為一個窗口對象的成員時,該對象的一個新的引用,或者稱作別名,就被創建(則該對象的引用計數自動加1)

減少引用計數:

當對象的引用被銷毀時,引用計數會減少。最明顯的例子就是當引用離開其作用範圍時,這種情況最經常出現在函數運行結束時,所有局部變量都被自動銷毀,對象的引用計數也就隨之減少。

當變量被賦值給另外一個對象時,源對象的引用技術也會自動減1

其他造成對象的引用計數減少的方式包括使用del語句刪除一個變量,或者當一個對象的引用計數在以下情況會減少:

  1. 一個本地引用離開了其作用範圍,比如函數結束

  2. 對象的別名被顯示的銷毀

  3. 對象的一個別名被賦值給其他的對象

  4. 對象被從一個窗口對象中移除

  5. 窗口對象本身被銷毀

例子:

>> import sys

>> a="ab"

>> sys.getrefcount("ab")

3 第一次結果為3

>> b="ab"

>> sys.getrefcount("ab")

4 第二次結果+1

>> b=0 b引用了其他的對象(0),對於"ab"來講就取消了一個引用

>> sys.getrefcount("ab")

3 結果在上次引用的基礎上-1

註意:在交互式解釋器中帶空格的對象引用次數永遠為3,但是在腳本中回歸正常,例如: #!/usr/bin/env python # coding=utf8 fdaf import sys print sys.getrefcount("ab cd") a="ab cd" print sys.getrefcount("ab cd") b="ab cd" print sys.getrefcount("ab cd") c=b print sys.getrefcount("ab cd")

垃圾收集:

不再被使用的內存會被一種稱為垃圾收集的機制釋放。像上面說的,雖然解釋器跟蹤對象的引用計數,但是垃圾收集器負責釋放內存。垃圾收集器是一塊獨立的代碼,它用來尋找引用計數為0的對象,他也負責檢查那些雖然引用計數大於0但也該被銷毀的對象。特定情形會導致循環引用。

一個循環引用發生在當你有至少兩個對象互相引用時,也就是所說的引用都消失時,這些引用仍然存在,這說明只靠引用計數是不夠的。Python的垃圾收集器實際上是一個引用計數器和一個循環垃圾收集器。當一個對象的引用計數變為0,解釋器會暫停,釋放掉這個對象和僅有這個對象可訪問的其他對象,作為引用計數的補充,垃圾收集器也會留心被分配的總量很大(以及未通過引用計數銷毀的那些) 的對象。在這種情況下,解釋器會暫停下來,試圖清理所有為引用的循環。

雲計算Python自動化:內部的引用計數