为什么与 nan 比较会产生 False (Python)?
Why does comparing to nan yield False (Python)?
在这里,我有以下内容:
>>> 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' returns 是真的?
我似乎无法追查nan的实施。它引导我到 C:\Python33\lib\site-packages\numpy\core\umath.pyd (row NAN = nan),但是从那里没有可追踪的方法来找出 nan 到底是什么。
numpy
的创建者认为,与 nan
(包括 ==
)的大多数比较应该产生 False
。您可以通过为对象定义 __eq__(self, other)
方法在 Python 中执行此操作。选择此行为只是因为它最有用,可用于各种目的。毕竟,一个条目有缺失值,另一个条目也有缺失值,并不意味着这两个条目相等。这只是意味着您不知道它们是否相等,因此最好不要将它们视为相等(例如,当您通过配对相应的方式将两个表连接在一起时行)。
另一方面,is
是 Python 关键字,不能被 numpy
覆盖。它测试两个对象是否是同一事物。 nan
与 nan
是同一个对象。无论如何,这也是有用的行为,因为通常你会想要,例如删除所有没有值的条目,您可以使用 is not nan
.
实现
nan in (nan,)
returns 正确,因为您可能知道,(nan,)
是一个只有一个元素 nan
的元组,当 Python 检查是否一个对象是 in
一个元组,它正在检查该对象是否 is
or
==
元组中的任何对象。
在这里,我有以下内容:
>>> 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' returns 是真的? 我似乎无法追查nan的实施。它引导我到 C:\Python33\lib\site-packages\numpy\core\umath.pyd (row NAN = nan),但是从那里没有可追踪的方法来找出 nan 到底是什么。
numpy
的创建者认为,与 nan
(包括 ==
)的大多数比较应该产生 False
。您可以通过为对象定义 __eq__(self, other)
方法在 Python 中执行此操作。选择此行为只是因为它最有用,可用于各种目的。毕竟,一个条目有缺失值,另一个条目也有缺失值,并不意味着这两个条目相等。这只是意味着您不知道它们是否相等,因此最好不要将它们视为相等(例如,当您通过配对相应的方式将两个表连接在一起时行)。
is
是 Python 关键字,不能被 numpy
覆盖。它测试两个对象是否是同一事物。 nan
与 nan
是同一个对象。无论如何,这也是有用的行为,因为通常你会想要,例如删除所有没有值的条目,您可以使用 is not nan
.
nan in (nan,)
returns 正确,因为您可能知道,(nan,)
是一个只有一个元素 nan
的元组,当 Python 检查是否一个对象是 in
一个元组,它正在检查该对象是否 is
or
==
元组中的任何对象。