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 /
答案 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