【发布时间】:2017-09-28 09:34:53
【问题描述】:
我正在使用 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) 和小负整数 (
为了比较,让我们继续 IDE 运行(我使用 PyCharm 和相同的 Python 3.6 解释器),我运行以下脚本
# IDE test case
x = 1000
y = 1000
print(x is y)
它打印 True,与交互式运行不同。感谢@Ahsanul Haque,他已经很好地解释了 IDE 运行和交互式运行之间的不一致。但是关于交互式运行中大正整数和小负整数之间不一致的问题仍然有待回答。
【问题讨论】:
-
根据Learning Python 5e,整数捕获仅适用于“小整数”。我想知道如何缓存小整数,这就是我测试上述内容的原因。我的问题是为什么我从交互模式和 IDE 运行中得到不一致的结果。哪个结果是正确的?
-
是的,我几乎立即撤回了我的近距离投票。我扫描你的问题太快了,我的错。
-
谢谢。当我看到你撤回我的评论时,我也删除了我的评论。谢谢你的帮助。你提供的那个链接对我很有帮助。
-
@vaultah 我确定我的问题现在与您指出的问题不同。我已经完全重写了我的问题,其中我描述了两种不同的奇怪行为,您提供的链接没有涵盖它们。