2011-09-25 53 views
5

爲什麼「sys.getrefcount()」的返回值

sys.getrefcount() 

,每大量或簡單的字符串返回3?這是否意味着3個對象的程序駐留的地方?還有,爲什麼不設置x =(非常大的數字)增加該對象的ref計數?這3個ref計數是否來自我的調用getrefcount? 謝謝你澄清這一點。

例如:

>>> sys.getrefcount(4234234555) 
3 
>>> sys.getrefcount("testing") 
3 
>>> sys.getrefcount(11111111111111111) 
3 
>>> x=11111111111111111 
>>> sys.getrefcount(11111111111111111) 
3 
+0

雖然x =「測試」增加了參考計數,但x =(大數)不會。 – kaiseroskilo

回答

9

大整數對象不被重用解釋器,讓您得到兩個不同的對象:

>>> a = 11111 
>>> b = 11111 
>>> id(a) 
40351656 
>>> id(b) 
40351704 

sys.getrefcount(11111)總是返回相同的數字,因爲它衡量一個新鮮的引用計數目的。

對於小整數,Python中總是重複使用相同的對象:

>>> sys.getrefcount(1) 
73 

通常你只有一次提到一個新的對象:

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

但整數在一個特殊的預分配由Python進行性能優化,並且我懷疑額外的兩個引用與此有關。

你可以看一下C實現這裏:http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

編輯:我並不明白這是怎麼回事的低層細節,我覺得有工作幾件事情,緩存臨時引用:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
6
  1. 小字符串和整數由Python的緩存來保存對對象的建設成本。

  2. 交互式Python解釋器保存您輸入的每個文字的臨時引用。將getrefcount('foobar')getrefcount('foo' + 'bar')進行比較。 (在後一種情況下,解釋有'foo''bar'引用。)

  3. manual

返回的數量一般是一個比你想象的更高,因爲它包含了(臨時)引用作爲參數getrefcount()

+0

因此,對於臨時文件,它的值爲1 + 1。第三個值是什麼?它是否屬於Python的內部? – kaiseroskilo

+2

@kaiseroskilo:不,臨時引用爲+2;一個在交互式頂層,一個在'getrefcount'本身,因爲該對象是作爲參數傳遞的。 –

+0

好吧,我現在得到它!謝謝! – kaiseroskilo