为什么系统获取引用计数给予巨大的价值?

2024-09-30 06:15:24 发布

您现在位置: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/


Tags: import版本libusrsys解释器价值print
2条回答

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

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

文字越独特,内部创建的机会就越小。在

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

正如您在这里的内部结构中看到的,一些小整数对象被创建并缓存以进行一些小的优化。 https://github.com/python/cpython/blob/2.7/Objects/intobject.c#L74

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

from __future__ import print_function

import sys

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

输出为:

^{pr2}$

相关问题 更多 >

    热门问题