是否首选:
if x is y:
return True
或
if x == y
return True
同样的事情是“不是”
答案 0 :(得分:40)
x is y
与x == 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 == y
和x 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
比较两个对象的身份,并且要求同一个对象的'x
和y
个不同的名称?'它等效到id(x) == id(y)
。
x == y
使用等于运算符并询问更宽松的问题'x
和y
是否相等?'对于用户定义的类型,它等同于{{ 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
在与True
,False
和None
进行比较时,更有可能使用这些内容。这样做的主要原因是这些对象是单例,这意味着每个值只有一个实例。为什么这么重要?好吧,这导致另一个原因......速度。
==
和 !=
,解释器必须提取两个引用的对象才能进行比较(是否为'是否相同),而 is
和 is not
只是检查他们所指的对象的值。有了这个说,你可以看到后一对将执行得更快,因为你不必为了进行比较而自己获取对象。这是几年前的速度测试,我们得出结论,对于一次性,这不是什么大问题,但如果它在一个紧密的循环中被称为无数次,那么它将开始加起来。
http://mail.python.org/pipermail/tutor/2008-June/062708.html
底线是您可以使用对象标识比较来检查True
,False
和None
,其他所有内容都应该使用直接相等运算符。我们不会进入实习整数或绑定实例方法,或者类似的东西。 : - )
答案 3 :(得分:4)
取决于。 is
和is not
进行身份比较,这对None
,Ellipsis
有用,或确保两个对象相同。否则,请使用==
或!=
。