为什么sys.getrefcount给出了巨大的价值?

时间:2017-05-21 12:21:42

标签: python

import sys

a = 10
b = a
print sys.getrefcount(a)
b=1
print sys.getrefcount(b)

输出:

22 614

我的python解释器有问题吗?为什么这会给出像614这样的巨大价值?

Python版

  

/usr/lib/python2.7 /

2 个答案:

答案 0 :(得分:4)

这是因为CPython在内部保留一个已创建的整数对象,其值为1,内部变量指向它。 只有一个这样的对象才有意义,因为它是不可变的。

同样的事情也适用于字符串文字,因为它们的不可变编译器通常在内存中保留一个唯一的字符串,并使变量指向它。

字面越独特,内部创建的机会就越少。

>>> sys.getrefcount(1337)
3
>>> sys.getrefcount('p')
14
>>> sys.getrefcount('StackOverflow')
3

正如您在此处的内部所见,创建了一些小整数对象并进行了一些小优化。 https://github.com/python/cpython/blob/2.7/Objects/intobject.c#L74

答案 1 :(得分:0)

如果将值更改为非平凡的值,您可以看到Python优化的效果(请参阅@ Nether的答案)。例如,如果您的代码更改为:

from __future__ import print_function

import sys

a = 1012345
b = a
print(sys.getrefcount(a))
b=12345678
print(sys.getrefcount(b))

输出结果为:

5
4