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 |
-
stackoverflow.com/questions/1504717/…
-
stackoverflow.com/questions/2209755/python-operation-vs-is-not
-
"is"运算符的可能重复行为与整数意外相关
-
Python 3.8(在本评论发布时仍在开发中)引入了一个SyntaxWarning,用于将is或is not与文字一起使用:bugs.python.org/issue34850
使用==。
有时,在某些python实现中,巧合的是,从-5到256的整数将与is一起使用(例如在CPython实现中)。但不要依赖于此或在真实程序中使用它。
-
定义__int__的类也无法与==一起正常工作;他们需要定义__eq__或__cmp__ :)
-
@Thomas:够公平的。固定。
-
这样做的原因是Python在运行时自动创建这些整数而不是动态构造它们以节省时间,因此这些特定的整数在程序中需要之前具有id。
-
is运算符使用该范围之外的整数,但它们只具有不同的标识(作为实现细节);我还以为范围是-5而不是-1
-
@Chris_Rands:我认为范围可能至少改变了一次,但我不
-
@ IgnacioVazquez-Abrams你可能是对的,因为它不能保证,可能是编辑扩展了一点:)
其他人已经回答了你的问题,但我会详细介绍一下:
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)。
-
is与Javascript的===不完全相同,或者至少与问题无关。例如,对于我来说2 ** 12 is 2 ** 12是False(这取决于实现),但在Javascript Math.pow(2, 12) === Math.pow(2, 12)中是True。
-
啊,呀,这是一个好点!更新。
1 2 3 4 5
| >>> a = 255556
>>> a == 255556
True
>>> a is 255556
False |
我认为应该回答;-)
原因是一些经常使用的对象,例如布尔值True和False,所有单字母字符串和短数字都由解释器分配一次,并且包含该对象的每个变量都引用它。其他数字和更大的字符串按需分配。例如,每次创建不同的对象时,255556被分配三次。因此,根据is,它们并不相同。
-
is用于比较的唯一安全用途是None对象。我想是...对象。
-
is适用于所有字符串,而不仅仅是1个字母的字符串。这在Python文档中称为字符串实习。
-
@ujukatzel - 错了。当我运行a ="this is one hell of a string"; b ="this is one hell of a string"; a is b时,我得到False作为结果。 Python(特别是CPython)只会实现一些小字符串。
-
@Chris Lutz - 虽然您发布的示例确实向我返回True,但实际上您是对的,它确实会失败一些更大的字符串。
-
值得指出的是(至少在CPython 1.5-3.7中),255556 is 255556是真的。这是因为编译器将同一编译单元中的某些不可变常量值折叠为单个值(如另一个问题所述)。但是你的结论是重要的部分:允许Python合并它想要的任何两个可证明不可变的值,并且也允许不这样做,并且很少有任何理由关心特定实现是否真的这样做。
-
@ChrisLutz肯定is True也有效吗?
这只适用于小数字,我猜它也依赖于实现。 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 |
使用==
-
它变得更糟。 CPython中-9 is -9是False!