各种Python指南都说使用x is None
代替x == None
。这是为什么?平等用于比较值,因此似乎很自然地询问x
是否具有值None
,用==
而不是is
表示。有人可以解释为什么is
是首选形式,并显示一个例子,其中两个不给出相同的答案?
感谢。
答案 0 :(得分:14)
人们使用is
的原因是因为使用==
没有任何好处。可以编写比较等于None
的对象,但这种情况并不常见。
class A(object):
def __eq__(self, other):
return True
print A() == None
输出:
True
is
运算符也更快,但我不认为这个事实很重要。
答案 1 :(得分:11)
is
关键字测试身份。它不是==
之类的比较运算符。使用is
不只是测试两个参数是否具有相同的值和/或相同的内部结构:即,它测试两个参数是否实际引用内存中的同一对象。这有很多含义,其中之一是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
比==
略快,因为它不执行方法查找,但我可能会弄错。当然,对于像列表或dicts这样的复杂容器对象,is
应该比==
(O(1)对O(n)快得多,大概是)。也就是说,速度问题大多是一个没有实际意义的问题,因为这两者不应该被认为是可以互换的。
答案 2 :(得分:3)
PEP 8说: "比较像单曲这样的单身人士应该始终与'''或者'不是,而不是平等运营商。"这是一个很好的解释原因:
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html