可能重复:
Python “is” operator behaves unexpectedly with integers
我正在学习Python,我很好奇为什么:
x = 500
x is 500
返回False,但是:
y = 100
y is 100
返回True?
答案 0 :(得分:8)
Python重用小整数。也就是说,所有1
s(例如)都是相同的1
对象。范围是-5到255,如果我没记错的话,虽然这是一个不应该依赖的CPython实现细节。我很确定Jython和IronPython会以不同的方式处理它。
这很好的原因是int
是不可变的。也就是说,您无法就地4
改为5
。如果a
的值为4,则a = 5
实际上将a
指向其他对象,而不是更改a
包含的值。 Python不共享任何可变类型(例如列表),其中意外地对同一对象进行多次引用可能会导致问题。
您应该使用==
来比较大多数事情。 is
用于检查两个引用是否指向同一个对象;它大致相当于id(x) == id(y)
。
答案 1 :(得分:4)
is
身份测试 - x is y
询问他们是否是同一个对象,而不是他们只是“等效”。所以你也有,例如:
>>> x = []
>>> y = []
>>> z = x
>>> x is y
False
>>> x is z
True
对于等价,您想要测试相等性:
>>> x = 500
>>> x == 500
True
Python(或者至少是cpython - 主要实现)进行一些优化,以便某些不可变对象在解释器的整个生命周期中只存在一次。因此,整个程序中的每个5
都是相同的整数对象。例如,字符串文字也会发生同样的事情。
答案 2 :(得分:3)
“是”比较对象ID,“==”将比较对象值。因此,如果您需要比较值,请使用“==”,如果您想比较对象,请使用“是”。
在Python中,一切都是对象,比较对象ID,它更快,但有时不可预测。你需要非常确定你正在做什么来使用“是”进行简单的比较。
关于上述情况,我在此处找到:http://docs.python.org/c-api/int.html以下评论:
当前实现为所有实体保留了一个整数对象数组 -5到256之间的整数,当你在该范围内创建一个int时 实际上只是返回对现有对象的引用。所以 应该可以改变1的值。我怀疑这种行为 在这种情况下,Python是未定义的。 : - )
因此,您可以执行以下测试并查看此行为:
>>> a = 256
>>> id(a)
19707932
>>> id(256)
19707932
>>> a = 257
>>> id(a)
26286076
>>> id(257)
26286064
因此,对于256以上的整数,“is”将不起作用。小心使用“是”进行比较。