为什么
sys.getrefcount()对于每个大数字或简单字符串返回3?这是否意味着3个对象驻留在程序中的某个地方?另外,为什么设置x=(非常大的数字)不会增加该对象的引用计数?这3个引用计数是由我调用getrefcount产生的吗?谢谢你澄清这一点。
例如:
>>> sys.getrefcount(4234234555)
3
>>> sys.getrefcount("testing")
3
>>> sys.getrefcount(11111111111111111)
3
>>> x=11111111111111111
>>> sys.getrefcount(11111111111111111)
3发布于 2011-09-25 17:13:29
大整数对象不会被解释器重用,因此您会得到两个不同的对象:
>>> a = 11111
>>> b = 11111
>>> id(a)
40351656
>>> id(b)
40351704sys.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发布于 2011-09-25 16:46:49
getrefcount('foobar')使用getrefcount('foo' + 'bar')。(在后一种情况下,解释器引用'foo'和'bar'。)返回的计数通常比您预期的大1,因为它将(临时)引用作为参数包含到getrefcount()。
发布于 2021-02-25 23:09:38
似乎当您将一个直接数作为参数传递给sys.getrefcount时,您有3个引用:
例如,让我们考虑一下:
>>> sys.getrefcount(123456)
3
>>> a = 123456
>>> sys.getrefcount(a)
2我真的不知道Python的想法是什么,但它仍然很有趣。我只能猜测原始整数(ref #1)被临时转换成一个int对象(ref #2),然后作为参数传递给sys.getrefcount (ref #3)。
https://stackoverflow.com/questions/7544395
复制相似问题