Python中的string比较:is vs. ==

我注意到我正在写的一个Python脚本是松鼠行事,并追溯到一个无限循环,其中循环条件是while line is not '' 。 在debugging器中运行它,事实certificate该行实际上是'' 。 当我把它改成!=''is not '' ,它工作正常。

另外,通常认为只要使用'=='默认情况下更好,即使比较int或布尔值? 我一直喜欢用'是',因为我觉得它更美观和pythonic(这就是我陷入这个陷阱…),但我想知道是否只是为了当你关心find两个具有相同ID的对象。

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

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

另外,通常认为只要使用'=='默认情况下更好,即使比较int或布尔值?

比较值时使用== ,比较身份时。

在比较int(或者一般的不可变types)时,你总是希望前者。 有一个优化,可以让小的整数与is进行比较,但不要依赖它。

对于布尔值,你不应该进行比较。 代替:

 if x == True: # do something 

写:

 if x: # do something 

为了与None进行比较, is None是优于== None

我一直喜欢用'是',因为我觉得它更美观和pythonic(这就是我陷入这个陷阱…),但我想知道是否只是为了当你关心find两个具有相同ID的对象。

是的,这正是它的目的。

我想展示一个关于is==如何涉及不可变types的小例子。 尝试一下:

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

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

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

比较值时应使用== ,并且在比较身份时。 (另外,从英文angular度来看,“等”与“是”不同)。

逻辑不是有缺陷的。 该声明

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

绝不应该被解读为意思

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

假设逻辑陈述的反面是正确的,读者的逻辑错误是逻辑错误。 见http://en.wikipedia.org/wiki/Converse_(logic);

看到这个问题

你的阅读逻辑

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

有点瑕疵。

如果适用,则==为真,但不适用于相反。 ==可能产生True,而产生False。