Python中的字符串比较:is与==
我发现我写的一个Python脚本有点奇怪,经过排查发现是因为它陷入了一个无限循环。这个循环的条件是 while line is not ''
。在调试的时候,我发现其实这个line的值是 ''
(也就是空字符串)。当我把条件改成 !=''
而不是 is not ''
时,程序就正常运行了。
另外,通常来说,比较整数或布尔值时,直接用 '==' 是否更好呢?我一直喜欢用 'is',因为我觉得这样看起来更好、更符合Python的风格(这也是我掉进这个陷阱的原因……),但我在想,'is' 是不是应该只用在你关心两个对象是否是同一个的时候。
4 个回答
这个逻辑没有问题。这个说法
如果 x 是 y,那么 x==y 也是真的
绝对不能理解为
如果 x==y,那么 x 是 y
如果读者认为逻辑语句的反向也是对的,那就是逻辑错误。想了解更多,可以看看这个链接:http://en.wikipedia.org/wiki/Converse_(logic)
我想给大家举个例子,说明一下 is
和 ==
在不可变类型中的作用。你可以试试这个:
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
is
是用来比较两个对象在内存中的位置,而 ==
是用来比较它们的值。例如,你会发现 Python 会缓存一些小整数:
c = 1
b = 1
>>> b is c
True
在比较值的时候应该用 ==
,而在比较对象的身份时应该用 is
。(另外,从英语的角度来看,“相等”和“是”是有区别的。)
对于所有内置的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。
没错,这正是它的用途。