Python中的字符串比较:is与==

613 投票
4 回答
1106576 浏览
提问于 2025-04-15 23:39

我发现我写的一个Python脚本有点奇怪,经过排查发现是因为它陷入了一个无限循环。这个循环的条件是 while line is not ''。在调试的时候,我发现其实这个line的值是 ''(也就是空字符串)。当我把条件改成 !='' 而不是 is not '' 时,程序就正常运行了。

另外,通常来说,比较整数或布尔值时,直接用 '==' 是否更好呢?我一直喜欢用 'is',因为我觉得这样看起来更好、更符合Python的风格(这也是我掉进这个陷阱的原因……),但我在想,'is' 是不是应该只用在你关心两个对象是否是同一个的时候。

4 个回答

76

这个逻辑没有问题。这个说法

如果 x 是 y,那么 x==y 也是真的

绝对不能理解为

如果 x==y,那么 x 是 y

如果读者认为逻辑语句的反向也是对的,那就是逻辑错误。想了解更多,可以看看这个链接:http://en.wikipedia.org/wiki/Converse_(logic)

282

我想给大家举个例子,说明一下 is== 在不可变类型中的作用。你可以试试这个:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

is 是用来比较两个对象在内存中的位置,而 == 是用来比较它们的值。例如,你会发现 Python 会缓存一些小整数:

c = 1
b = 1
>>> b is c
True

在比较值的时候应该用 ==,而在比较对象的身份时应该用 is。(另外,从英语的角度来看,“相等”和“是”是有区别的。)

668

对于所有内置的Python对象(比如字符串、列表、字典、函数等等),如果x和y是同一个东西(x is y),那么x和y的值也是相等的(x==y).

但并不是总是这样。NaN(不是一个数字)就是一个反例。不过通常情况下,身份(用is来判断)意味着相等(用==来判断)。但反过来就不一定成立:两个不同的对象可以有相同的值。

一般来说,比较整数或布尔值时,默认使用==是否更好呢?

当你想比较值的时候用==,而当你想比较身份的时候用is

在比较整数(或者一般的不可变类型)时,你几乎总是想用前者。虽然有一种优化可以让小整数用is来比较,但不要依赖这个。

对于布尔值,你其实不应该进行比较。不要这样写:

if x == True:
    # do something

应该这样写:

if x:
    # do something

在比较None时,使用is None== None更好。

我一直喜欢用is,因为我觉得它更美观,也更符合Python的风格(这也是我掉进这个陷阱的原因……),但我想知道它是否只是用来找两个对象是否有相同的ID。

没错,这正是它的用途。

撰写回答