Python的首选比较运算符

23 投票
4 回答
7557 浏览
提问于 2025-04-15 21:14

是更推荐这样做:

if x is y:
    return True

还是这样做:

if x == y
    return True

对于“不是”也是一样的道理。

4 个回答

9
  • ==!= 是用来比较对象的 的操作符
  • isis not 是用来比较对象的 身份 的操作符

正如其他人所说,is(和 is not)主要是在你真的 关心 两个变量是否指向完全相同的对象时使用。在大多数情况下,你其实并不在意,所以你会用 ==!=

不过,如果你多看一些 Python 代码,你可能会发现,is(和 is not)更常用于比较 TrueFalseNone。主要原因是这些对象是单例,也就是说每种值只有一个实例。那这有什么关系呢?这就引出了另一个原因……速度。

使用 ==!= 时,解释器需要提取两个对象来进行比较(看看它们是否相同),而 isis not 只需检查它们所指向的对象的值。这样一来,你就可以看到后者的速度更快,因为不需要提取对象本身就能进行比较。几年前有个速度测试得出的结论是,对于偶尔使用的情况,这没什么大不了,但如果在一个紧凑的循环中调用了无数次,那就会开始累积。

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

总之,你可以用对象身份比较来检查 TrueFalseNone,而其他情况应该直接使用相等操作符。我们这里就不讨论内部整数或绑定实例方法之类的内容了。:-)

15

x is y 是用来比较两个对象是否是同一个东西。它在问 'xy 是不是指向同一个对象?' 这就相当于 id(x) == id(y),也就是看它们的身份是否一样。

x == y 则是用来比较两个对象的值是否相等,它问的是 'xy 是不是相等?' 对于用户自定义的类型,这个比较相当于 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 通常是比 == 更具体的比较。

40

x is yx == y 是完全不同的概念。

x is y 只有在 id(x) == id(y) 时才为真,也就是说,xy 必须是同一个对象(它们的 id 是一样的)。

对于所有内置的 Python 对象(比如字符串、列表、字典、函数等),如果 x is y 为真,那么 x == y 也一定为真。不过,这并不是普遍适用的。严格来说,x == y 只有在 x.__eq__(y) 返回真时才为真。

你可以定义一个对象 x,让它的 __eq__ 方法总是返回假,比如这样做的话,即使 x is y 为真,x == y 也会返回假。

所以,总的来说,x is yx == 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

撰写回答