一尘不染

“sys.getrefcount()” 返回值

python

Why does

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

阅读 452

收藏
2021-01-20

共1个答案

一尘不染

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

>>> 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
2021-01-20