gpt4 book ai didi

python - 整数对象身份测试 : inconsistent behavior between large positive and small negative integers

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:57 25 4
gpt4 key购买 nike

我正在使用 Anaconda (Python 3.6)。

在交互模式下,我对正整数 >256 进行了对象身份测试:

# Interactive test 1
>>> x = 1000
>>> y = 1000
>>> x is y
False

显然,在交互模式下不会重用分行写入的大整数 (>256)。

但是如果我们把赋值写在一行中,这个大的正整数对象就会被重用:

# Interactive test 2
>>> x, y = 1000, 1000
>>> x is y
True

也就是说,在交互模式下,将整数赋值写在一行或单独的行中会对重用整数对象 (>256) 产生影响。对于 [-5,256] 中的整数(如 https://docs.python.org/2/c-api/int.html 所述),缓存机制确保只创建一个对象,无论赋值是在同一行还是不同行。

现在让我们考虑小于 -5 的小负整数(任何超出范围 [-5, 256] 的负整数都可以达到目的),令人惊讶的结果出现了:

# Interactive test 3
>>> x, y = -6, -6
>>> x is y
False # inconsistent with the large positive integer 1000

>>> -6 is -6
False

>>> id(-6), id(-6), id(-6)
(2280334806256, 2280334806128, 2280334806448)

>>> a = b =-6
>>> a is b
True # different result from a, b = -6, -6

显然,这表明大正整数 (>256) 和小负整数 (<-5) 之间的对象身份测试不一致。而对于小的负整数(<-5),写成a,b=-6,-6和a=b=-6的形式也有区别(相比之下,对于大整数使用哪种形式并不重要) ).对这些奇怪的行为有什么解释吗?

为了比较,让我们转到 IDE 运行(我使用 PyCharm 和相同的 Python 3.6 解释器),我运行以下脚本

# IDE test case
x = 1000
y = 1000
print(x is y)

它打印 True,不同于交互式运行。感谢@Ahsanul Haque,他已经对 IDE 运行和交互式运行之间的不一致给出了很好的解释。但是对于交互式运行中大正整数和小负整数不一致的问题还有待回答。

最佳答案

仅为特定源代码创建特定常量的一个副本,并在需要时重复使用。因此,在 pycharm 中,您将得到 x is y == True

但是,在解释器中,情况有所不同。在这里,一次只有一行/一条语句运行。为每一行创建一个特定的常量。它不会在下一行中重复使用。所以,这里 x 不是 y

但是,如果您可以在同一行中进行初始化,则可以有相同的行为(重复使用相同的常量)。

>>> x,y = 1000, 1000
>>> x is y
True
>>> x = 1000
>>> y = 1000
>>> x is y
False
>>>

编辑:

block 是作为一个单元执行的一段 Python 程序文本。

在 IDE 中,整个模块立即执行,即整个模块是一个 block 。但在交互模式下,每条指令实际上是一次性执行的一段代码。

正如我之前所说,一个特定的常量为一个代码块创建一次,如果再次出现在该代码块中则重复使用。

这是 IDE 和解释器之间的主要区别。

那么,为什么对于较小的数字,解释器实际上会给出与 IDE 相同的输出?这是在考虑整数缓存的时候。

如果数字较小,则将它们缓存起来并在下一个代码块中重复使用。所以,我们在 IDE 中得到了相同的 id。

但如果它们更大,则不会缓存它们。而是创建了一个新副本。所以,正如预期的那样,id 是不同的。

希望这现在有意义,

关于python - 整数对象身份测试 : inconsistent behavior between large positive and small negative integers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43711154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com