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

标签 python python-3.x pycharm google-colaboratory python-idle

例如:
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 这适用​​于任何地方。
谁能告诉我有什么问题。

最佳答案

为了简化上面评论中提到的内容并进一步说明:
发生这种情况是因为在您的第一个示例中,在运行之前编译了整个块 - 这允许编译器在调用代码本身之前对其进行优化,而在第二种情况下,每个语句都被自己编译和运行(不知道任何关于之前的声明)。
在后一种情况下,只有小整数缓存生效,因为编译器对前面的语句一无所知。
不要以任何方式依赖于此。如果将语句保存到文件中并运行它,它将显示与 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

关于python - 为什么 python 整数缓存范围 [-5, 256] 不能在所有平台上以类似的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63188021/

相关文章:

python - 为 Pandas 中的每一列提取平均值

python - 有没有一种方法可以使字典的字典顺序忽略大小写?

python - 同时使用值列表拆分字符串

python - Python 在处理大量数字/列表时是否有问题,或者我的代码有问题?

python-3.x - 如何使用selenium重新连接到webdriver打开的浏览器?

python - PyCharm 5.0.4 上的 python.exe 中的语法错误

python - 如何迭代一行并相互比较?

python - 随机化字符串的大小写

python-3.x - PyCharm 单元测试 : AttributeError: module 'enum' has no attribute 'IntFlag'

python - 以下代码运行没有任何错误,但记录未插入表中