小编典典

"is" 运算符对整数的行为异常

all

为什么以下在 Python 中会出现意外行为?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
>>> 257 is 257
True           # Yet the literal numbers compare properly

我正在使用 Python 2.5.2。尝试一些不同版本的 Python,似乎 Python 2.3.3 显示了 99 到 100 之间的上述行为。

基于上述,我可以假设 Python
是在内部实现的,因此“小”整数的存储方式与较大的整数不同,并且is操作员可以分辨出差异。为什么有泄漏的抽象?当我事先不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好方法是什么?


阅读 107

收藏
2022-03-07

共1个答案

小编典典

看看这个:

>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
11662816
>>> id(b)
11662828

这是我在 Python 2 文档“Plain Integer
Objects”
中找到的内容(对于Python
3
也是如此):

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int
时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)

2022-03-07