python“is”返回True但“==”返回False

时间:2014-02-17 09:10:42

标签: python numpy comparison

只要“是”返回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

编辑:

浮动nan 的3个表达式只是遗留的旧numpy版本还是有其他用途?

3 个答案:

答案 0 :(得分:7)

不,不是NaN。您已找到其中一个例外情况。根据{{​​3}},NaN不等于任何东西,甚至不是自己:

  

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

不只是numpy表现得像这样:

>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False

任何根据IEEE标准实现浮点运算的编程语言。

多个拼写可以匹配名称的常用首字母。它是 Not a Number 的缩写,不同的人将缩写大写不同。

对于同一个对象,

is总是True,但==甚至不能保证返回布尔值。来自IEEE 754

  

按照惯例,返回FalseTrue以进行成功比较。但是,这些方法可以返回任何值,因此如果在布尔上下文中使用比较运算符(例如,在if语句的条件下),Python将在值上调用bool()来确定是否结果是真是假。

答案 1 :(得分:3)

浮点标准(IEEE 754)要求NaN值的任何比较都不相等。这对于声称实现IEEE 754的任何编程语言都很常见,而不仅仅是Python。

另见维基百科的description of a NaN

答案 2 :(得分:2)

引自docs

  

numpy中定义的特殊值:nan,inf,

     

NaNs可以用作穷人的面具(如果你不关心什么的   原值是)

     

注意:不能使用相等来测试NaN。例如:

     

...

     

np.nan == np.nan#总是错的!请改用特殊的numpy函数。假