在Python中使用“is”或“==”进行数字比较是否更好?

Is it better to use “is” or “==” for number comparison in Python?

使用"is"运算符或"=="运算符来比较Python中的两个数字是否更好?

例子:

1
2
3
4
5
6
7
8
9
>>> a = 1
>>> a is 1
True
>>> a == 1
True
>>> a is 0
False
>>> a == 0
False


使用==

有时,在某些python实现中,巧合的是,从-5到256的整数将与is一起使用(例如在CPython实现中)。但不要依赖于此或在真实程序中使用它。


其他人已经回答了你的问题,但我会详细介绍一下:

Python的is比较身份 - 它问的问题是"这一件事实际上是与其他事物相同的对象"(类似于Java中的==)。因此,有时候使用is是有意义的 - 最常见的是检查None。例如,foo is None。但是,一般来说,这不是你想要的。

另一方面,==问一个问题"这一件事在逻辑上等同于另一件事"。例如:

1
2
3
4
>>> [1, 2, 3] == [1, 2, 3]
True
>>> [1, 2, 3] is [1, 2, 3]
False

这是正确的,因为类可以定义用于测试相等性的方法:

1
2
3
4
5
6
7
8
9
>>> class AlwaysEqual(object):
...     def __eq__(self, other):
...         return True
...
>>> always_equal = AlwaysEqual()
>>> always_equal == 42
True
>>> always_equal == None
True

但是他们无法定义用于测试身份的方法(即,他们不能覆盖is)。


1
2
3
4
5
>>> a = 255556
>>> a == 255556
True
>>> a is 255556
False

我认为应该回答;-)

原因是一些经常使用的对象,例如布尔值True和False,所有单字母字符串和短数字都由解释器分配一次,并且包含该对象的每个变量都引用它。其他数字和更大的字符串按需分配。例如,每次创建不同的对象时,255556被分配三次。因此,根据is,它们并不相同。


这只适用于小数字,我猜它也依赖于实现。 Python对小数字使用相同的对象实例(iirc <256),但是对于更大的数字,这会改变。

1
2
3
4
5
6
>>> a = 2104214124
>>> b = 2104214124
>>> a == b
True
>>> a is b
False

所以你应该总是使用==来比较数字。


==是你想要的,"是"恰好适用于你的例子。


1
2
3
4
>>> 2 == 2.0
True
>>> 2 is 2.0
False

使用==