首页 > 解决方案 > 为什么 python 整数缓存范围 [-5, 256] 不能在所有平台上以类似的方式工作?

问题描述

例如:

pycharm

a = 256
b = 256
print(a is b)
>>>True  # This is fine.

但!

a = 257
b = 257
print(a is b)
>>>True  # This should be False.

Colaboratory/IDLE/etc.

a = 256
b = 256
print(a is b)
>>>True  # This is fine.


a = 257
b = 257
print(a is b)
>>>False  # This is fine.

根据理论:

在该范围内引用了一个整数,Python 将使用该对象的缓存版本。所以内存地址是一样的。

期待 pycharm 这适用​​于任何地方。

谁能告诉我有什么问题。

标签: pythonpython-3.xpycharmgoogle-colaboratorypython-idle

解决方案


为了简化上面评论中提到的内容并进一步说明:

发生这种情况是因为在您的第一个示例中,整个块是在运行之前编译的 - 这允许编译器在调用代码本身之前对其进行优化,而在第二种情况下,每个语句都是自行编译和运行的(不知道任何关于以前的陈述)。

在后一种情况下,只有小整数缓存生效,因为编译器对前面的语句一无所知。

不要以任何方式依赖它。如果您将语句保存到文件并运行它,它将显示与 PyCharm 相同的结果:

~ cat test.py
a = 257
b = 257
print(a is b)
~ python3 test.py
True
~ python test.py
True 

你也可以在 REPL 中复制这个行为,给它一个单独的块来编译:

>>> def test():
...   a = 257
...   b = 257
...   print(a is b)
...
>>> test()
True

推荐阅读