Python 中的字符串比较:is 与 == [重复]
- 2024-12-04 08:56:00
- admin 原创
- 175
问题描述:
我注意到我编写的 Python 脚本有点奇怪,并追踪到一个无限循环,其中循环条件是while line is not ''
。在调试器中运行它,结果发现该行实际上是''
。当我将其更改为!=''
而不是 时is not ''
,它工作正常。
另外,即使在比较 int 或布尔值时,默认使用 '==' 是否通常被认为更好?我一直喜欢使用 'is',因为我发现它更美观且更具 Python 风格(这就是我陷入这个陷阱的原因……),但我想知道它是否仅用于当您关心查找具有相同 id 的两个对象时。
解决方案 1:
对于所有内置 Python 对象(如字符串、列表、字典、函数等),如果 x 是 y,则 x==y 也为 True。
并非总是如此。NaN 是一个反例。但通常情况下,身份 ( is
) 意味着相等 ( ==
)。反之则不成立:两个不同的对象可以具有相同的值。
此外,即使在比较 int 或布尔值时,通常是否认为默认使用“==”更好?
==
在比较值和is
比较身份时使用。
当比较整数(或一般的不可变类型)时,您几乎总是希望使用前者。有一种优化允许将小整数与进行比较is
,但不要依赖它。
对于布尔值,你根本不应该进行比较。而不是:
if x == True:
# do something
写:
if x:
# do something
为了进行比较None
,is None
优于== None
。
我一直喜欢使用“is”,因为我发现它更美观、更符合 Python 风格(这就是我陷入这个陷阱的原因......),但我想知道它是否只是为了在你关心查找具有相同 id 的两个对象时使用。
是的,它正是这个用途。
解决方案 2:
我想举一个小例子来说明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”不同。)
解决方案 3:
逻辑上没有缺陷。
如果 x 是 y,则 x==y 也为 True
不应该被理解为
如果 x==y 则 x 是 y
如果读者认为逻辑陈述的反面是真的,那么这是一个逻辑错误。请参阅http://en.wikipedia.org/wiki/Converse_(logic)
解决方案 4:
看到这个问题
你阅读时的逻辑
对于所有内置 Python 对象(如字符串、列表、字典、函数等),如果 x 是 y,则 x==y 也为 True。
稍有瑕疵。
如果is
适用==
则为 True,但反过来则不适用。==
可能产生 True,而可能is
产生 False。