为什么 python 整数缓存范围 [-5, 256] 不能在所有平台上以类似的方式工作?
Why python integer caches range [-5, 256] don't work in similar way on all platform?
例如:
在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
例如:
在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