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