Python中的None与identity相同

时间:2012-06-23 04:02:46

标签: python coding-style

各种Python指南都说使用x is None代替x == None。这是为什么?平等用于比较值,因此似乎很自然地询问x是否具有值None,用==而不是is表示。有人可以解释为什么is是首选形式,并显示一个例子,其中两个不给出相同的答案?

感谢。

3 个答案:

答案 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