为什么
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)
| 归档时间: |
|
| 查看次数: |
2631 次 |
| 最近记录: |