Python 为什么np.float(';nan';)会导致dicts出现问题,而math.nan不会?

Python 为什么np.float(';nan';)会导致dicts出现问题,而math.nan不会?,python,numpy,Python,Numpy,这说明了使用numpy中的nan是如何导致dict出现问题的,为什么math.nan的行为会有所不同?(蟒蛇3) 输出 {nan: 'bip'} {nan: 'foo', nan: 'bar'} 这是因为math.nan是一个模块级属性,所以两次都得到相同的对象。CPython dicts具有身份检查的快捷方式† >>> any(k == math.nan for k in d) False >>> math.nan in d True 使用np.floa

这说明了使用numpy中的nan是如何导致dict出现问题的,为什么math.nan的行为会有所不同?(蟒蛇3)

输出

{nan: 'bip'}
{nan: 'foo', nan: 'bar'}

这是因为
math.nan
是一个模块级属性,所以两次都得到相同的对象。CPython dicts具有身份检查的快捷方式†

>>> any(k == math.nan for k in d)
False
>>> math.nan in d
True
使用
np.float('nan')
可以进行函数调用,每次都返回不同的实例。使用Python内置的
float('nan')
也是类似的,这与numpy并没有真正的关系

>>> np.float('nan') is np.float('nan')
False
>>> math.nan is math.nan
True
>>> float('nan') is float('nan')
False

†列表、元组等也有此功能。请参阅了解更多信息。

此外,下面两个都是正确的:
math.nan是math.nan
np.float('nan')不是np.float('nan')
事实上,在许多平台上,
np.float是float
@wim:在
numpy
是官方发行版的每个平台上
>>> np.float('nan') is np.float('nan')
False
>>> math.nan is math.nan
True
>>> float('nan') is float('nan')
False