Python中的字符串比较:is vs. ==

我注意到我正在编写的Python脚本运行异常,并将其追踪到一个无限循环,其中循环条件为while line is not ''。在调试器中运行它,发现这一行实际上是''。当我把它改为!=''而不是is not ''时,它工作得很好。

此外,即使在比较int或布尔值时,通常认为默认使用'=='更好吗?我一直喜欢使用“is”,因为我觉得它更美观,更符合python语言(这就是我落入这个陷阱的原因……),但我想知道它是否只是为了在需要查找具有相同id的两个对象时使用。

1081123 次浏览

看到# EYZ0

你的阅读逻辑

对于所有内置的Python对象(如 字符串,列表,字典,函数, 等等),如果x是y,那么x==y也是 真的。< / p >

有点瑕疵。

如果is适用,那么==将为True,但它不适用相反的情况。==可能会产生True,而is可能会产生False。

对于所有内置的Python对象(如 字符串,列表,字典,函数, 等等),如果x是y,那么x==y也是 真的。< / p >

不总是正确的。NaN是一个反例。但是通常,同一性(is)意味着相等性(==)。相反的情况是不正确的:两个不同的对象可以有相同的值。

此外,通常认为在默认情况下使用'=='更好,甚至 当比较int或布尔值?< / p >

比较值时使用==,比较标识时使用is

在比较int型(或一般的不可变类型)时,通常都希望使用前者。有一个优化,允许小整数与is进行比较,但不要依赖它。

对于布尔值,根本不应该进行比较。而不是:

if x == True:
# do something

写:

if x:
# do something

None相比,is None优先于== None

我一直喜欢用“is”,因为 我觉得它更有美感 和pythonic(这就是我陷入的 这个陷阱…),但我想知道它是否 只是想留到什么时候 你关心的是找到两个物体

是的,这正是它的用途。

我想展示一个小例子,说明is==在不可变类型中是如何涉及的。试一试:

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

is比较内存中的两个对象,==比较它们的值。例如,你可以看到小整数被Python缓存:

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

比较值时使用==,比较标识时使用is。(此外,从英语的角度来看,“equals”和“is”是不同的。)

这种逻辑没有缺陷。该声明

如果x是y,则x==y也是True

从来没有应该被理解为什么意思

如果x==y,则x= y

读者一方假设逻辑语句的反面是正确的,这是一个逻辑错误。看到# EYZ0