Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python整数缓存范围为[-5256]don';在所有平台上都不能以类似的方式工作? 例如: 在pycharm中: 但是 在Colaboratory/IDLE/etc.中:_Python_Python 3.x_Pycharm_Google Colaboratory_Python Idle - Fatal编程技术网

为什么python整数缓存范围为[-5256]don';在所有平台上都不能以类似的方式工作? 例如: 在pycharm中: 但是 在Colaboratory/IDLE/etc.中:

为什么python整数缓存范围为[-5256]don';在所有平台上都不能以类似的方式工作? 例如: 在pycharm中: 但是 在Colaboratory/IDLE/etc.中:,python,python-3.x,pycharm,google-colaboratory,python-idle,Python,Python 3.x,Pycharm,Google Colaboratory,Python Idle,根据理论: 如果在该范围内引用整数,Python将使用该对象的缓存版本。所以内存地址将是相同的 这在任何地方都有效 谁能告诉我问题出在哪里。为了简化上面评论中提到的内容并进一步说明它: 之所以会发生这种情况,是因为在第一个示例中,整个块都是在运行之前编译的——这允许编译器在调用代码之前对其进行优化,而在第二个示例中,每个语句都是自己编译和运行的(不知道前面的语句) 在后一种情况下,只有小整数缓存生效,因为编译器对前面的语句一无所知 不要以任何方式依赖于此。如果将语句保存到文件并运行该文件,则会显

根据理论:

如果在该范围内引用整数,Python将使用该对象的缓存版本。所以内存地址将是相同的

这在任何地方都有效


谁能告诉我问题出在哪里。为了简化上面评论中提到的内容并进一步说明它:

之所以会发生这种情况,是因为在第一个示例中,整个块都是在运行之前编译的——这允许编译器在调用代码之前对其进行优化,而在第二个示例中,每个语句都是自己编译和运行的(不知道前面的语句)

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

不要以任何方式依赖于此。如果将语句保存到文件并运行该文件,则会显示与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

CPython不会在任何平台上缓存257。您正在看到缓存常量、不可变文本的效果,当这种情况发生时并不简单,通常,如果常量文本是同一“块”的一部分,则必须缓存它们,因此编译代码的准确程度很重要。字符串文字也会发生这种情况;DR:这是一个实现细节,它不仅取决于一个平台内的几个因素,而且在不同的平台之间可能会有很大的差异。你不应该期望
is
一开始就提供任何特定的结果,因此它到底是如何工作或为什么工作的,这确实是一个没有意义的问题;之所以会出现这种情况,是因为在第一个示例中,整个块都是在运行之前编译的——这允许编译器在代码运行之前对其进行优化,而在第二个示例中,每个语句都是自己编译和运行的——这意味着只有小整数缓存生效。不要以任何方式依赖于此。如果您将语句保存到一个文件并运行它,它将显示与PyCharm相同的结果;b=1000;print(a是b)将打印
True
(顺便说一句,我真的很想知道为什么这些关于整数和
的问题时不时出现-人们真的认为他们需要知道这种行为和/或使用
那么多吗?)
a = 256
b = 256
print(a is b)
>>>True  # This is fine.


a = 257
b = 257
print(a is b)
>>>False  # This is fine.
~ cat test.py
a = 257
b = 257
print(a is b)
~ python3 test.py
True
~ python test.py
True 
>>> def test():
...   a = 257
...   b = 257
...   print(a is b)
...
>>> test()
True