Python的首选比较运算符
是更推荐这样做:
if x is y:
return True
还是这样做:
if x == y
return True
对于“不是”也是一样的道理。
4 个回答
==
和!=
是用来比较对象的 值 的操作符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
,而其他情况应该直接使用相等操作符。我们这里就不讨论内部整数或绑定实例方法之类的内容了。:-)
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
通常是比 ==
更具体的比较。
x is y
和 x == y
是完全不同的概念。
x is y
只有在 id(x) == id(y)
时才为真,也就是说,x
和 y
必须是同一个对象(它们的 id
是一样的)。
对于所有内置的 Python 对象(比如字符串、列表、字典、函数等),如果 x is y
为真,那么 x == y
也一定为真。不过,这并不是普遍适用的。严格来说,x == y
只有在 x.__eq__(y)
返回真时才为真。
你可以定义一个对象 x
,让它的 __eq__
方法总是返回假,比如这样做的话,即使 x is y
为真,x == y
也会返回假。
所以,总的来说,x is y
和 x == y
是完全不同的测试方式。
举个例子:
In [1]: 0 is False
Out[1]: False
In [2]: 0 == False
Out[2]: True
顺便说一下,
if x is y:
return True
else:
return False
用下面的方式写会更符合 Python 的风格:
return x is y
同样,
if x == y:
return True
else:
return False
可以用下面的方式替换:
return x == y