为什么
sys.getrefcount()
为每个大数字或简单字符串返回3?这是否意味着3个对象驻留在程序中的某个位置?另外,为什么不设置x =(非常大的数字)会增加该对象的引用计数?我调用getrefcount的结果? 谢谢你澄清这一点。
例如:
>>> sys.getrefcount(4234234555)
3
>>> sys.getrefcount("testing")
3
>>> sys.getrefcount(11111111111111111)
3
>>> x=11111111111111111
>>> sys.getrefcount(11111111111111111)
3
答案 0 :(得分:10)
解释器不会重用大型整数对象,因此您将获得两个不同的对象:
>>> a = 11111
>>> b = 11111
>>> id(a)
40351656
>>> id(b)
40351704
sys.getrefcount(11111)始终返回相同的数字,因为它测量新对象的引用计数。
对于小整数,Python总是重用相同的对象:
>>> sys.getrefcount(1)
73
通常,您只能获得一个对象的一个引用:
>>> sys.getrefcount(object())
1
但整数被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
答案 1 :(得分:6)
Python缓存小字符串和整数以节省对象构建成本。
交互式Python解释器包含您输入的每个文字的临时引用。将getrefcount('foobar')
与getrefcount('foo' + 'bar')
进行比较。 (在后一种情况下,口译员引用'foo'
和'bar'
。)
来自manual:
返回的计数通常比您预期的高一个,因为它包含(临时)引用作为
getrefcount()
的参数。
答案 2 :(得分:1)
似乎当您将直接数作为参数传递给 sys.getrefcount 时,您有 3 个引用:
例如,让我们考虑一下:
>>> sys.getrefcount(123456)
3
>>> a = 123456
>>> sys.getrefcount(a)
2
我真的不知道 Python 脑子里会发生什么,但它仍然很有趣。我只能猜测原始整数 (ref #1) 被临时转换为 int 对象 (ref #2),然后将其作为参数传递给 sys.getrefcount (ref #3)。