Python 的首选比较运算符[重复]

问题描述 投票:0回答:4

首选这样做:

if x is y:
    return True

if x == y
    return True

“不是”也是一样

python comparison
4个回答
40
投票

x is y
x == y
不同。

当且仅当

x is y

 时,
id(x) == id(y)
为真——也就是说,
x
y
必须是同一个对象(具有相同的
id
)。

对于所有内置的 Python 对象(如字符串、列表、字典、函数等),如果

x is y
,则
x == y
也为 True。然而,这通常并不能得到保证。严格来说,当且仅当
x == y
返回 True 时,
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

PS。而不是

if x is y:
    return True
else:
    return False

写起来更Pythonic

return x is y

同样,

if x == y:
    return True
else:
    return False

可以替换为

return x == y

15
投票

x is y
比较两个对象的身份,并询问'同一个对象的
x
y
是否有不同的名称?'
相当于
id(x) == id(y)

x == y
使用相等运算符并提出更宽松的问题 '
x
y
相等吗?'
对于用户定义类型,它相当于
x.__eq__(y)

__eq__
特殊方法应该表示对象的“相等”,例如表示分数的类希望 1/2 等于 2/4,即使“一半”对象不能具有与“两季度”对象。

请注意,不仅

a == b
并不意味着
a is b
,反之亦然。一般来说,其中一个要求并不比另一个更严格。是的,这意味着如果您确实愿意,您可以让
a == a
返回
False
,例如:

>>> a = float('nan')
>>> a is a
True
>>> a == a
False

实际上,

is
几乎总是比
==
更具体的比较。


9
投票
  • ==
    !=
    是对象 比较运算符
  • is
    is not
    是对象 identity 比较运算符

正如其他人已经说过的,

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
,而其他所有内容都应该使用直接的相等运算符。我们不会在这里讨论实习整数或绑定实例方法或类似的内容。 :-)


5
投票

视情况而定。

is
is not
进行身份比较,这有利于
None
Ellipsis
,或者确保两个对象相同。否则,请使用
==
!=

© www.soinside.com 2019 - 2024. All rights reserved.