Python的首选比较运算符

ens*_*are 23 python comparison

是否优先做:

if x is y:
    return True
Run Code Online (Sandbox Code Playgroud)

要么

if x == y
    return True
Run Code Online (Sandbox Code Playgroud)

同样的事情是"不是"

unu*_*tbu 40

x is y 不同于x == y.

x is y为真,当且仅当id(x) == id(y)-也就是说, x并且y必须是一个和相同的对象(具有相同的id多个).

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

例如,可以使用始终返回False x__eq__方法定义对象,这将导致x == y返回False,即使x is y.

所以底线是,x is y 并且 x == y是完全不同的测试.

以此为例:

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

In [2]: 0 == False
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

PS.代替

if x is y:
    return True
else:
    return False
Run Code Online (Sandbox Code Playgroud)

写作更像Pythonic

return x is y
Run Code Online (Sandbox Code Playgroud)

同样地,

if x == y:
    return True
else:
    return False
Run Code Online (Sandbox Code Playgroud)

可以替换为

return x == y
Run Code Online (Sandbox Code Playgroud)

  • 我有点挑剔,但是在"x是y"之前你需要`x == y`才是真的是不正确的.它们是独立的测试.不可否认,在实践中你很难找到一个明智的反例,但是`__eq__`特殊方法可能只返回'False`或引发异常. (7认同)

Sco*_*ths 15

x is y比较两个对象的身份,并询问" 同一个对象的名称xy名称是什么?" 它相当于id(x) == id(y).

x == y使用相等运算符并询问更宽松的问题'是xy平等?' 对于用户定义的类型,它等同于x.__eq__(y).

__eq__特殊方法应该代表"equalness"的对象,例如零碎一类希望1/2到2/4相等,即使"二分之一"的对象不能有相同的标识为"两季"宾语.

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

>>> a = float('nan')
>>> a is a
True
>>> a == a
False
Run Code Online (Sandbox Code Playgroud)

在实践is中,几乎总是比一个更具体的比较==.

  • 分数示例真的是当场,伟大的斯科特.:) (6认同)

wes*_*cpy 9

  • ==并且!=是对象比较运算符
  • is并且is not是对象标识比较运算符

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

然而,你可能会开始什么要注意,如果你看很多的Python代码,是is(和is not)更容易对比较时要使用True,FalseNone.这样做的主要原因是这些对象是单例,这意味着每个值只有一个实例.为什么这么重要?好吧,这导致另一个原因......速度.

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

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

底线是,你可以使用对象的身份比较针对检查True,False以及None和其他一切应该使用直线上升相等运算符.我们不会进入实习整数或绑定实例方法,或者类似的东西.:-)


Ign*_*ams 5

要看。isis not做身份的比较,这是良好的NoneEllipsis或确保两个对象是相同的。否则,请使用==!=