各种 Python 指南说使用x is None
而不是x == None
. 这是为什么?相等用于比较值,因此询问是否x
具有值似乎很自然None
,用==
和 not表示is
。有人可以解释为什么is
是首选形式并举例说明两者给出的答案不同吗?
谢谢。
各种 Python 指南说使用x is None
而不是x == None
. 这是为什么?相等用于比较值,因此询问是否x
具有值似乎很自然None
,用==
和 not表示is
。有人可以解释为什么is
是首选形式并举例说明两者给出的答案不同吗?
谢谢。
人们使用的原因is
是因为使用没有优势==
。可以编写比较等于 的对象None
,但这并不常见。
class A(object):
def __eq__(self, other):
return True
print A() == None
输出:
True
运算符也更快,但我认为这个is
事实并不重要。
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))。也就是说,速度问题主要是一个有争议的问题,因为两者不应被视为可以互换。
PEP 8 说:“与像 None 这样的单例的比较应该始终使用 'is' 或 'is not' 来完成,而不是相等运算符。” 这是一个很好的解释为什么:
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html