在这里,我有以下内容:
>>> import numpy as np
>>> q = np.nan
>>> q == np.nan
False
>>> q is np.nan
True
>>> q in (np.nan, )
True
那么,问题来了:为什么楠不等于楠,而是楠? (独一无二)为什么"in"返回 True? 我似乎无法追踪 nan 的实现。 它把我引向了 C:\Python33\lib\site-packagesumpy\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,)
返回 True,因为您可能知道,(nan,)
是一个只有一个元素的元组,nan
,当 Python 检查对象是否in
元组时,它会检查该对象是否is
or
==
元组中的任何对象。