2013-11-22 108 views
4

所以當我創建一個沒有引用的對象時(據我所知),爲什麼Python會認爲它有一個refcount呢?爲什麼Python在創建時爲對象創建兩個重新計數?

>>> import sys 
>>> sys.getrefcount(object()) 
1 

根據這個額外的人數計算,以下是有意義的。

>>> o = object() 
>>> sys.getrefcount(o) 
2 
>>> l = list((o,)) 
>>> sys.getrefcount(o) 
3 
>>> del l[0] 
>>> sys.getrefcount(o) 
2 

而且它似乎是在

>>> del o 

的Python將垃圾收集的對象,但不是嗎?如果仍然有參考,那在哪裏?

回答

6

當您的參數傳遞給該函數時,Python計算在getrefcount函數內創建的引用。

返回對象的引用計數。返回的計數通常比您預期的要高,因爲它包含(臨時)引用作爲getrefcount()的參數。

From the Python documents

作爲垃圾收集,Python將刪除參考存儲在變量odel o被調用。基本上sys.getrefcount將始終至少返回1,因爲它需要在函數內創建對參數的引用,以計算對傳入參數的任何其他引用。以下面的輸出爲例,希望對此有所瞭解。

>>> o = object() 
>>> import sys 
>>> sys.getrefcount(o) 
2 
>>> del o 
>>> sys.getrefcount(o) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'o' is not defined 

我們可以看到這個參考已被刪除,垃圾收集器現在將收集這些在其下一次掃描,因爲沒有可供參考的第一行創建了對象。 Discussion of Python garbage collection in relation to the del method

7

當您調用sys.getrefcount()時,會爲該函數內的本地使用生成一個引用。 getrefcount()將始終將實際計數加1,因爲它計算了它自己的內部參考值。

相關問題