我注意到我正在写的一个Python脚本表现得很奇怪,并追踪到一个无限循环,其中的循环条件是while line is not ''
。在调试器中运行它,结果发现那一行实际上是''
。当我把它改为!=''
而不是is not ''
时,它就正常了。
另外,一般认为默认情况下使用'=='更好,即使在比较int或boolean值时也是如此?我一直喜欢使用'is',因为我觉得它更符合审美和pythonic(我就是这样掉进这个陷阱的......),但我想知道它是否只是为了在你关心找到两个具有相同id的对象时保留。
对于所有内置的Python对象(如 字符串、列表、数据集、函数。 等),如果x是y,那么x==y也是 真。
不一定。 NaN就是一个反例。 但是通常,同一性("是")意味着平等("==")。 反之亦然:两个不同的对象可以有相同的值。
另外,一般认为默认情况下使用'=='更好,即使是 在比较int或boolean值时也是如此?
你在比较值的时候使用==
,在比较同一性的时候使用is
。
当比较ints(或一般的不可变类型)时,你几乎总是想用前者。 有一项优化允许小整数与is
进行比较,但不要依赖它。
对于布尔值,你根本就不应该进行比较。 而不是。
if x == True:
# do something
写。
if x:
# do something
对于与 "无 "的比较,"是无 "优于"==无"。
我一直喜欢使用'is' 因为 我觉得它更有美感 和pythonic(我就是这样掉进了 陷......),但我想知道它是否's 的目的只是为了保留给当 你关心的是如何找到两个对象 具有相同的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"不同)。