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

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


当前回答

参见这个问题

你的阅读逻辑

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

有点瑕疵。

如果is适用,则==将为True,但反之则不适用。==的结果为True,而is的结果为False。

其他回答

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

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

此外,通常认为在默认情况下只使用'=='更好吗 当比较int或布尔值?

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

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

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

if x == True:
    # do something

写:

if x:
    # do something

对于与None进行比较,is None优先于== None。

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

是的,这正是它的用途。

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

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

不应该被解读为意思吗

如果x==y,则x= y

读者一方假设逻辑语句的反面是正确的,这是一个逻辑错误。看到http://en.wikipedia.org/wiki/Converse_(逻辑)

参见这个问题

你的阅读逻辑

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

有点瑕疵。

如果is适用,则==将为True,但反之则不适用。==的结果为True,而is的结果为False。

我想用一个小例子说明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”是不同的。)