Python值实际上并不等同

时间:2012-09-24 00:38:27

标签: python

  

可能重复:
  Python “is” operator behaves unexpectedly with integers

我正在学习Python,我很好奇为什么:

x = 500
x is 500

返回False,但是:

y = 100
y is 100

返回True?

3 个答案:

答案 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”将不起作用。小心使用“是”进行比较。