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



在这个问题中,从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

最新更新