何时使用==,何时使用is?
有趣的是:
>>> 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
它们的本质是不同的。
==
是通过调用__eq__
方法来进行比较的。is
只有在两个引用指向同一个对象时才会返回真。
如果拿Java来比较的话:
is
和对象的==
是一样的。==
和对象的equals
是一样的。
21
根据我的理解,is
是用来检查两个对象是否是同一个东西。因为没有强制的“字符串驻留”,所以两个刚好字符顺序相同的字符串,通常不是同一个字符串对象。
当你从一个字符串中提取子字符串(或者说从一个序列中提取任何子序列)时,你会得到两个不同的对象,它们的内容是一样的。
所以,只有在你比较对象的身份时,才使用 is
。而在比较值的时候,应该使用 ==
。