16

各种 Python 指南说使用x is None而不是x == None. 这是为什么?相等用于比较值,因此询问是否x具有值似乎很自然None,用==和 not表示is。有人可以解释为什么is是首选形式并举例说明两者给出的答案不同吗?

谢谢。

4

3 回答 3

14

人们使用的原因is是因为使用没有优势==。可以编写比较等于 的对象None,但这并不常见。

class A(object):
    def __eq__(self, other):
        return True

print A() == None

输出:

True

运算符也更快,但我认为这个is事实并不重要。

于 2012-06-23T04:05:11.963 回答
11

is关键字测试身份。它不是比较运算符,如==. Usingis不仅仅测试两个参数是否具有相同的值和/或相同的内部结构:即,它测试两个参数是否实际上引用了内存中的同一个对象。这有很多含义,其中一个是is不能重载,另一个是可变类型和不可变类型之间的行为不同。例如,考虑以下情况:

>>> l1 = range(5)
>>> l2 = range(5)
>>> l1 == l2
True
>>> l1 is l2
False
>>> l3 = l1
>>> l1 is l3
True
>>> s1 = "abcde"
>>> s2 = "abcde"
>>> s1 == s2
True
>>> s1 is s2
True

在这里,由于列表是可变的,它们不能共享内存中的位置,因此is==产生不一致的结果。另一方面,字符串是不可变的,因此在某些情况下它们的内存可能会被池化。基本上,is只能可靠地用于简单的、不可变的类型,或者在多个名称指向内存中完全相同的对象的情况下(例如l3上面示例中的使用),并且它的使用表明希望测试身份而不是价值。我希望is==它不执行方法查找要快一些,但我可能弄错了。当然,对于复杂的容器对象,如列表或字典,is应该比==(大概是 O(1) 与 O(n))。也就是说,速度问题主要是一个有争议的问题,因为两者不应被视为可以互换。

于 2012-06-23T05:43:53.437 回答
3

PEP 8 说:“与像 None 这样的单例的比较应该始终使用 'is' 或 'is not' 来完成,而不是相等运算符。” 这是一个很好的解释为什么:

http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html

于 2012-06-23T22:13:06.303 回答