何时使用==,何时使用is?

36 投票
6 回答
19263 浏览
提问于 2025-04-16 20:47

有趣的是:

>>> a = 123
>>> b = 123
>>> a is b
True
>>> a = 123.
>>> b = 123.
>>> a is b
False

看起来 a is b 的意思差不多就是 id(a) == id(b)。这样写很容易出错:

basename, ext = os.path.splitext(fname)
if ext is '.mp3':
    # do something
else:
    # do something else

有些文件名意外地进入了 else 代码块。解决这个问题很简单,我们应该用 ext == '.mp3' 来替代,但表面上看 if ext is '.mp3' 似乎是个很优雅的 Python 写法,而且比“正确”的写法更容易阅读。

因为字符串是不可变的,那为什么这样写是错的呢?在什么情况下用身份检查更好,什么情况下用相等检查更好呢?

6 个回答

18

在Python中判断使用is还是==的简单规则

这里有一个简单的规则(除非你想深入了解Python解释器的理论,或者在构建一些有趣的Python对象框架):

只有在比较None的时候才使用is。

if foo is None

其他情况下使用==。

if x == 3

这样你就比较安全了。这个规则的原因在上面的评论中已经解释过了。如果你不完全确定为什么要这样做,就不要使用is。

23

它们的本质是不同的。

  1. == 是通过调用 __eq__ 方法来进行比较的。
  2. is 只有在两个引用指向同一个对象时才会返回真。

如果拿Java来比较的话:

  1. is 和对象的 == 是一样的。
  2. == 和对象的 equals 是一样的。
21

根据我的理解,is 是用来检查两个对象是否是同一个东西。因为没有强制的“字符串驻留”,所以两个刚好字符顺序相同的字符串,通常不是同一个字符串对象。

当你从一个字符串中提取子字符串(或者说从一个序列中提取任何子序列)时,你会得到两个不同的对象,它们的内容是一样的。

所以,只有在你比较对象的身份时,才使用 is。而在比较值的时候,应该使用 ==

撰写回答