在这个问题中,从numpy中使用nan是如何导致dict出现问题的,为什么math.nan的行为不同?(Python 3(
import math
import numpy as np
d = {math.nan:'baz', math.nan:'bip' }
print(d)
e = {np.float('nan'):'foo', np.float('nan'):'bar' }
print(e)
输出
{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
†列表、元组等也有这一点。有关详细信息,请参阅生成一个对象x,使"x in[x]"返回False