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)
Sco*_*ths 15
x is y比较两个对象的身份,并询问" 同一个对象的名称x和y名称是什么?" 它相当于id(x) == id(y).
x == y使用相等运算符并询问更宽松的问题'是x和y平等?' 对于用户定义的类型,它等同于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中,几乎总是比一个更具体的比较==.
==并且!=是对象值比较运算符is并且is not是对象标识比较运算符正如其他人已经说过的那样,is(和is not)只有当你真正关心一对变量指的是完全相同的对象时.在大多数情况下,你真的不在乎,所以你会使用==和!=.
然而,你可能会开始什么要注意,如果你看很多的Python代码,是is(和is not)更容易对比较时要使用True,False和None.这样做的主要原因是这些对象是单例,这意味着每个值只有一个实例.为什么这么重要?好吧,这导致另一个原因......速度.
同==和!=,解释有拉涨,以使(他们是否是相同的或不)的比较都提到的对象,而is和is not只是简单地检查他们指的是对象的值.有了这个说,你可以看到后一对将执行得更快,因为你不必为了进行比较而自己获取对象.这是几年前的速度测试,在那里我们得出结论,对于一次性,这不是什么大问题,但如果它在一个紧密的循环中被称为无数次,那么它将开始加起来.
http://mail.python.org/pipermail/tutor/2008-June/062708.html
底线是,你可以使用对象的身份比较针对检查True,False以及None和其他一切应该使用直线上升相等运算符.我们不会进入实习整数或绑定实例方法,或者类似的东西.:-)
| 归档时间: |
|
| 查看次数: |
7367 次 |
| 最近记录: |