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
大整数对象不会被解释器重用,因此您将获得两个 不同的对象:
>>> 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