为什么与 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 覆盖。它测试两个对象是否是同一事物。 nannan 是同一个对象。无论如何,这也是有用的行为,因为通常你会想要,例如删除所有没有值的条目,您可以使用 is not nan.

实现

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