Python中的字符串比较:是vs ==

时间:2010-06-07 08:31:49

标签: python string comparison equality

我注意到我写的一个Python脚本是松散的,并将其追溯到无限循环,其中循环条件为while line is not ''。在调试器中运行它,事实证明该行实际上是''。当我将其更改为!=''而不是is not ''时,它运行正常。

此外,通常认为默认使用'=='更好,即使在比较int或Boolean值时也是如此?我一直喜欢使用'是'因为我发现它更美观和pythonic(这就是我陷入这个陷阱...),但我想知道它是否只是为了保留当你关心找到两个具有相同身份的对象。

4 个答案:

答案 0 :(得分:570)

  

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

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

  

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

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

当比较整数(或一般的不可变类型)时,你几乎总是想要前者。有一个优化允许将小整数与is进行比较,但不依赖它。

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

if x == True:
    # do something

写:

if x:
    # do something

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

  

我一直喜欢用“是”因为   我发现它在美学上更令人愉悦   和pythonic(这是我陷入的方式   这个陷阱...),但我不知道是不是   意图只是为了什么时候保留   你关心找到两个物体   具有相同的身份。

是的,这正是它的用途。

答案 1 :(得分:246)

我想展示一个关于is==如何参与不可变类型的小例子。试试这个:

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

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

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

在比较值时,您应该使用==,在比较身份时,应使用is。 (另外,从英语的角度来看,“等于”与“是”不同。)

答案 2 :(得分:65)

逻辑没有缺陷。声明

  

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

永远应该被理解为

  

如果x == y则x为y

读者认为逻辑陈述的反转是正确的,这是一个逻辑错误。见http://en.wikipedia.org/wiki/Converse_(logic)

答案 3 :(得分:25)

请参阅This question

你的阅读逻辑

  

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

略有缺陷。

如果is适用,那么==将为True,但不会反过来适用。 ==可能会产生True而is产生False。