我注意到我正在编写的Python脚本运行异常,并将其追踪到一个无限循环,其中循环条件为while line is not ''。在调试器中运行它,发现这一行实际上是''。当我把它改为!=''而不是is not ''时,它工作得很好。
while line is not ''
''
!=''
is not ''
此外,即使在比较int或布尔值时,通常认为默认使用'=='更好吗?我一直喜欢使用“is”,因为我觉得它更美观,更符合python语言(这就是我落入这个陷阱的原因……),但我想知道它是否只是为了在需要查找具有相同id的两个对象时使用。
看到# EYZ0
你的阅读逻辑
对于所有内置的Python对象(如 字符串,列表,字典,函数, 等等),如果x是y,那么x==y也是 真的。< / p >
有点瑕疵。
如果is适用,那么==将为True,但它不适用相反的情况。==可能会产生True,而is可能会产生False。
is
==
不总是正确的。NaN是一个反例。但是通常,同一性(is)意味着相等性(==)。相反的情况是不正确的:两个不同的对象可以有相同的值。
此外,通常认为在默认情况下使用'=='更好,甚至 当比较int或布尔值?< / p >
比较值时使用==,比较标识时使用is。
在比较int型(或一般的不可变类型)时,通常都希望使用前者。有一个优化,允许小整数与is进行比较,但不要依赖它。
对于布尔值,根本不应该进行比较。而不是:
if x == True: # do something
写:
if x: # do something
与None相比,is None优先于== None。
None
is None
== None
我一直喜欢用“is”,因为 我觉得它更有美感 和pythonic(这就是我陷入的 这个陷阱…),但我想知道它是否 只是想留到什么时候 你关心的是找到两个物体
是的,这正是它的用途。
我想展示一个小例子,说明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”是不同的。)
这种逻辑没有缺陷。该声明
如果x是y,则x==y也是True
从来没有应该被理解为什么意思
如果x==y,则x= y
读者一方假设逻辑语句的反面是正确的,这是一个逻辑错误。看到# EYZ0