Python的首选比较运算符

时间:2010-04-05 03:48:19

标签: python comparison

是否首选:

if x is y:
    return True

if x == y
    return True

同样的事情是“不是”

4 个答案:

答案 0 :(得分:40)

x is yx == y不同。

当且仅当x is y - id(x) == id(y)x必须是同一个对象(具有相同的{{1}时,

y才属实}}为s)。

对于所有内置Python对象(如字符串,列表,dicts,函数等),如果id,则x is y也为True。但是,一般情况下不保证这一点。严格来说,x == y当且仅当x == y返回True时才为真。

例如,可以使用x.__eq__(y)方法定义对象x,该方法始终返回False,这将导致__eq__返回False,即使{{1} }。

所以底线是,x == yx is y是完全不同的测试。

以此为例:

x is y

PS。而不是

x == y

写更多Pythonic

In [1]: 0 is False
Out[1]: False

In [2]: 0 == False
Out[2]: True

同样地,

if x is y:
    return True
else:
    return False

可以替换为

return x is y

答案 1 :(得分:15)

x is y比较两个对象的身份,并且要求同一个对象的'xy个不同的名称?'它等效到id(x) == id(y)

x == y使用等于运算符并询问更宽松的问题'xy是否相等?'对于用户定义的类型,它等同于{{ 1}}。

x.__eq__(y)特殊方法应该表示对象的“相等性”,例如表示分数的类需要1/2等于2/4,即使“一半”对象不能具有与“两个季度”对象相同的身份。

请注意,不仅__eq__不暗示a == b,而且反过来也是如此。其中一个通常不是一个比另一个更严格的要求。是的,这意味着如果您真的想要,可以a is b返回a == a,例如:

False

在实践中,虽然>>> a = float('nan') >>> a is a True >>> a == a False 几乎总是比is更具体的比较。

答案 2 :(得分:9)

  • == != 是对象比较运算符
  • is is not 是对象身份比较运算符

正如其他人已经说过的那样, is (以及 is not )只有在您真正关注时一对变量指的是完全相同的对象。在大多数情况下,你真的不在乎,所以你会使用 == !=

但是,如果你看一下很多Python代码,你可能会注意到的是 is (以及 is not 在与TrueFalseNone进行比较时,更有可能使用这些内容。这样做的主要原因是这些对象是单例,这意味着每个值只有一个实例。为什么这么重要?好吧,这导致另一个原因......速度。

== != ,解释器必须提取两个引用的对象才能进行比较(是否为'是否相同),而 is is not 只是检查他们所指的对象的值。有了这个说,你可以看到后一对将执行得更快,因为你不必为了进行比较而自己获取对象。这是几年前的速度测试,我们得出结论,对于一次性,这不是什么大问题,但如果它在一个紧密的循环中被称为无数次,那么它将开始加起来。

http://mail.python.org/pipermail/tutor/2008-June/062708.html

底线是您可以使用对象标识比较来检查TrueFalseNone,其他所有内容都应该使用直接相等运算符。我们不会进入实习整数或绑定实例方法,或者类似的东西。 : - )

答案 3 :(得分:4)

取决于。 isis not进行身份比较,这对NoneEllipsis有用,或确保两个对象相同。否则,请使用==!=