首页 > 解决方案 > 小数缓存是在 Python 规范中定义的,还是一个实现细节?

问题描述

Python 似乎对 -5 到 256 范围内的数字有一个所谓的“小数缓存”。我们可以用下面的程序来证明这一点:

for i in range(-7, 258):
    if id(i) == id(i + 0):
        print(i, "is cached")
    else:
        print(i, "is not cached")

输出是

-7 is not cached
-6 is not cached
-5 is cached
-4 is cached
[...]
255 is cached
256 is cached
257 is not cached

我想知道这是在 Python 规范中定义还是实现细节。

标签: pythonlanguage-lawyer

解决方案


这是一个实现细节:Python 语言参考(所有版本,从 2.7 到 3.9)的第 3.1 章说:

对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用

例如, aftera = 1; b = 1a可能b会或可能不会引用具有值 1 的同一对象,具体取决于实现

(强调我的)

Python/C API 参考也提到了它

当前实现为 -5 到 256 之间的所有整数保留一个整数对象数组,

(强调我的)这也很清楚,这在未来可能会改变。


推荐阅读