"系统获取引用计数()“返回值

2024-04-26 21:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么

sys.getrefcount() 

每个大数或简单字符串都返回3?这是否意味着程序中有3个对象?另外,为什么设置x=(非常大的数字)不增加对象的ref计数?这3个ref count是我调用getrefcount的结果吗? 谢谢你澄清这一点。在

例如:

^{pr2}$

Tags: 对象字符串程序refcountsys数字计数
2条回答
  1. Python缓存小字符串和整数,以节省对象构建成本。

  2. 交互式Python解释器保存对您输入的每个文本的临时引用。比较getrefcount('foobar')与{}。(在后一种情况下,解释器引用了'foo'和{}。)

  3. 来自manual:

The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().

解释程序不会重用大整数对象,因此可以得到两个不同的对象:

>>> a = 11111
>>> b = 11111
>>> id(a)
40351656
>>> id(b)
40351704

在系统获取引用计数(11111)总是返回相同的数字,因为它测量新对象的引用计数。在

对于小整数,Python总是重用同一个对象:

^{2}$

通常您只能得到一个对新对象的引用:

>>> sys.getrefcount(object())
1

但是,为了性能优化,Python在一个特殊的pre-maloced区域分配了整数,我怀疑额外的两个引用与此有关。在

您可以在这里查看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

相关问题 更多 >