"sys.getrefcount()"返回值

kai*_*ilo 5 python

为什么

sys.getrefcount() 
Run Code Online (Sandbox Code Playgroud)

对于每个大数字或简单字符串返回3?这是否意味着3个对象驻留在程序中的某个位置?另外,为什么不设置x =(非常大的数字)会增加该对象的引用计数?这3个引用计数是否来自于我的打电话给getrefcount?谢谢你澄清这一点.

例如:

>>> sys.getrefcount(4234234555)
3
>>> sys.getrefcount("testing")
3
>>> sys.getrefcount(11111111111111111)
3
>>> x=11111111111111111
>>> sys.getrefcount(11111111111111111)
3 
Run Code Online (Sandbox Code Playgroud)

max*_*axy 10

解释器不会重用大型整数对象,因此您将获得两个不同的对象:

>>> a = 11111
>>> b = 11111
>>> id(a)
40351656
>>> id(b)
40351704
Run Code Online (Sandbox Code Playgroud)

sys.getrefcount(11111)始终返回相同的数字,因为它测量新对象的引用计数.

对于小整数,Python总是重用相同的对象:

>>> sys.getrefcount(1)
73
Run Code Online (Sandbox Code Playgroud)

通常,您只能获得一个对象的一个​​引用:

>>> sys.getrefcount(object())
1
Run Code Online (Sandbox Code Playgroud)

但是整数被Python分配到一个特殊的前malloced区域以进行性能优化,我怀疑额外的两个引用与此有关.

你可以在这里查看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
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 6

  1. Python缓存小字符串和整数以节省对象构建成本.

  2. 交互式Python解释器包含您输入的每个文字的临时引用.比较getrefcount('foobar')getrefcount('foo' + 'bar').(在后一种情况下,解释器引用了'foo''bar'.)

  3. 手册:

返回的计数通常比您预期的高一个,因为它包含(临时)引用作为参数getrefcount().

  • @kaiseroskilo:不,它是临时引用的+2; 一个在交互式toplevel中,一个在`getrefcount`本身,因为该对象作为参数传递. (2认同)