python中的字符串比较:is与==

String comparison in Python: is vs. ==

本问题已经有最佳答案,请猛点这里访问。

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

此外,在默认情况下,即使在比较int或boolean值时,也只使用"=="更好吗?我一直喜欢用"i s"这个词,因为我觉得它在美学上更讨人喜欢,而且更像Python(我就是这样掉进这个陷阱的…),但我想知道,它是否只是为了在你想找到两个ID相同的物体时使用。


For all built-in Python objects (like
strings, lists, dicts, functions,
etc.), if x is y, then x==y is also
True.

并不总是这样。Nan就是一个反例。但通常,同一性(is表示平等(==)。相反,两个不同的对象可以有相同的值。

Also, is it generally considered better to just use '==' by default, even
when comparing int or Boolean values?

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

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

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

1
2
if x == True:
    # do something

写:

1
2
if x:
    # do something

None相比,is None优于== None

I've always liked to use 'is' because
I find it more aesthetically pleasing
and pythonic (which is how I fell into
this trap...), but I wonder if it's
intended to just be reserved for when
you care about finding two objects
with the same id.

是的,这正是它的目的。


我想举一个例子,说明is==是如何涉及不可变类型的。试试看:

1
2
3
4
5
6
a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True

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

1
2
3
4
c = 1
b = 1
>>> b is c
True

比较值时应使用==,比较身份时应使用is。(同样,从英语的角度来看,"等于"不同于"是"。)


逻辑没有缺陷。声明

if x is y then x==y is also True

不应该被解读为

if x==y then x is y

读者认为逻辑语句的逆命题是正确的,这是一个逻辑错误。参见http://en.wikipedia.org/wiki/converse_uu(逻辑)


看到这个问题

你的阅读逻辑

For all built-in Python objects (like
strings, lists, dicts, functions,
etc.), if x is y, then x==y is also
True.

有点瑕疵。

如果is适用,那么==是正确的,但它不适用于相反的情况。==可能产生真,而is可能产生假。