为什么与nan比较会产生False(Python)?

为什么与nan比较会产生False(Python)?,python,numpy,floating-point,nan,Python,Numpy,Floating Point,Nan,在这里,我有以下几点: >>> import numpy as np >>> q = np.nan >>> q == np.nan False >>> q is np.nan True >>> q in (np.nan, ) True 所以,问题是:为什么nan不等于nan,而是nan? (唯一)为什么“in”返回True? 我似乎无法追踪nan的实现。这让我想到了C:\Python33\lib\site

在这里,我有以下几点:

>>> import numpy as np
>>> q = np.nan
>>> q == np.nan
False
>>> q is np.nan
True
>>> q in (np.nan, )
True
所以,问题是:为什么nan不等于nan,而是nan? (唯一)为什么“in”返回True?
我似乎无法追踪nan的实现。这让我想到了C:\Python33\lib\site packages\numpy\core\umath.pyd(row NAN=NAN),但从那里没有可追踪的方法来找出NAN实际上是什么。

numpy的创建者认为,与
NAN
的大多数比较(包括
=
)都应该产生
。在Python中,可以通过为对象定义一个
\uuuueq\uuuu(self,other)
方法来实现这一点。选择这种行为仅仅是因为它对于各种目的最有用。毕竟,一个条目缺少值,而另一个条目也缺少值这一事实并不意味着这两个条目相等。这只是意味着您不知道它们是否相等,因此最好不要将它们视为相等(例如,当您通过配对相应的行将两个表连接在一起时)

另一方面,
is
是一个Python关键字,不能被
numpy
覆盖。它测试两个对象是否相同
nan
是与
nan
相同的对象。无论如何,这也是一种有用的行为,因为您通常希望删除所有没有值的条目,这可以通过
is not nan
实现


nan in(nan,)
返回True,因为您可能知道,
(nan,)
是一个只有一个元素的元组,
nan
,当Python检查对象是否在元组中时,它正在检查对象
是元组中的
还是
=
任何对象。

numpy
的创建者认为,与
nan
的大多数比较(包括
=
)应该产生
False
是最有意义的。在Python中,可以通过为对象定义一个
\uuuueq\uuuu(self,other)
方法来实现这一点。选择这种行为仅仅是因为它对于各种目的最有用。毕竟,一个条目缺少值,而另一个条目也缺少值这一事实并不意味着这两个条目相等。这只是意味着您不知道它们是否相等,因此最好不要将它们视为相等(例如,当您通过配对相应的行将两个表连接在一起时)

另一方面,
is
是一个Python关键字,不能被
numpy
覆盖。它测试两个对象是否相同
nan
是与
nan
相同的对象。无论如何,这也是一种有用的行为,因为您通常希望删除所有没有值的条目,这可以通过
is not nan
实现


nan in(nan,)
返回True,因为您可能知道,
(nan,)
是一个只有一个元素的元组,
nan
,当Python检查对象是否在元组中时,它正在检查该对象
还是
=
元组中的任何对象。

有很多东西不是数字、飞船、恐龙、cookies…numpy中
NaN
的可能副本至少具有
np.NaN!=np.nan
是的,我明白了,它们不相等。但是你忽略了问题的三个要点:1)为什么(q是np.nan)是真的2)为什么(q在(np.nan,))中起作用3)nan是如何实现的。有很多东西不是“数字”、飞船、恐龙、cookies……numpy中的
nan
可能的重复至少具有
np.nan!=np.nan
是的,我明白了,它们不相等。但是你忽略了问题的三个要点:1)为什么(q是np.nan)是真的2)为什么(q在(np.nan,))中起作用3)nan是如何实现的。答案很好,谢谢。但它有点忽略了这两点:1)为什么(q in(np.nan,))起作用?1) nan是如何实现的?我确实回答了它是如何实现的;它有一个
\uuuu eq\uuu
方法,返回
False
。至于为什么
q在(nan,)
中起作用——基本上是因为
in
检查对象
是否是元组中的任何对象。我将更新我的答案以反映这一点。打字错误:当你的意思是“是”时,你写“在另一方面”。更重要的是:“当Python检查一个对象是否在元组中时,它正在检查该对象
是否是元组中的任何对象”不是真的-它检查对象
是否是元组中的任何对象。@Denziloe Aha不,我需要更好地阅读-链接的文档是一个增强建议,而不是现有文档的文档feature@Denziloe相当地最好说IEEE-754浮点标准的作者认为最好将
NaN==NaN
设为false。numpy(和Python)刚刚公开了C编译器的IEEE-754浮点语义。回答得很好,谢谢。但它有点忽略了这两点:1)为什么(q in(np.nan,))起作用?1) nan是如何实现的?我确实回答了它是如何实现的;它有一个
\uuuu eq\uuu
方法,返回
False
。至于为什么
q在(nan,)
中起作用——基本上是因为
in
检查对象
是否是元组中的任何对象。我将更新我的答案以反映这一点。打字错误:当你的意思是“是”时,你写“在另一方面”。更重要的是:“当Python检查一个对象是否在元组中时,它正在检查该对象
是否是元组中的任何对象”不是真的-它检查对象
是否是元组中的任何对象。@Denziloe Aha不,我需要更好地阅读-链接的文档是一个增强建议,而不是现有文档的文档feature@De