python"is"返回True但"=="返回False

zha*_*hen 2 python comparison numpy

只要"是"返回True,不应该"=="返回True?

In [101]: np.NAN is np.nan is np.NaN
Out[101]: True

In [102]: np.NAN == np.nan 
Out[102]: False

In [103]: np.NaN == np.nan
Out[103]: False

In [104]: np.NaN == np.NAN
Out[104]: False
Run Code Online (Sandbox Code Playgroud)

编辑:

float nan的3个表达式只是旧numpy版本的遗留物还是有其他用法?

Mar*_*ers 8

不,不是NaN.您已找到其中一个例外情况.根据IEEE 754,NaN不等于任何东西,甚至不是自己:

与NaN 进行比较时,即使与自身进行比较,也会返回无序结果.

不只是numpy表现得像这样:

>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False
Run Code Online (Sandbox Code Playgroud)

任何根据IEEE标准实现浮点运算的编程语言也是如此.

多个拼写可以匹配名称的共同首都.它是Not a Number的缩写,不同的人将缩写大写不同.

is总是会出现True在同一个对象中,但==甚至不能保证返回一个布尔值.从__eq__文档:

按照惯例,False并True返回一个成功的比较.但是,这些方法可以返回任何值,因此如果在布尔上下文中使用比较运算符(例如,在if语句的条件下),Python将调用bool()该值以确定结果是true还是false.