Python中list.index查找np.nan索引时为何有时抛出ValueError?
问题解答
list.index() 的底层匹配逻辑
Python 内置列表的 index(x) 方法匹配逻辑非常明确,遍历列表中每个元素 elem 时会按顺序执行两个判断:
- 先做身份判断:如果
elem is x为真,直接匹配成功,返回当前元素的下标 - 身份判断不成立时,再做值相等判断:如果
elem == x为真,同样匹配成功,返回当前元素的下标 - 所有元素都不满足以上两个条件时,抛出
ValueError异常
np.nan 查找出现差异的原因
你观察到的现象完全符合上面的匹配规则:
调用
a.index(np.nan)成功的原因:
你初始化列表a = [np.nan, np.nan]时,写入的两个np.nan都是 numpy 预定义的全局 nan 单例对象,和你直接传入index方法的np.nan是同一个身份,所以第一个元素就满足elem is np.nan的条件,直接返回 0,根本不会走到值相等判断的步骤,自然不会触发np.nan != np.nan的特性。调用
a.index(b)失败的原因:np.nanmax(a)返回的 nan 是 numpy 运算过程中新生成的 nan 对象,和全局np.nan身份不同(你打印的 id 输出已经验证了这一点),所以遍历列表元素时,elem is b的判断全部失败,接下来走值相等判断时,np.nan == np.nan的规则是返回 False,所以所有元素都匹配失败,最终抛出异常。
普通数值 id 不同仍能匹配成功的原因
你测试的 3.1 这类普通数值,转 numpy 数组再转列表后生成的 c[1] 虽然是新的 float 对象,和 a[1] 身份不同,is 判断失败,但 3.1 == 3.1 的结果为 True,所以值相等判断可以匹配成功,不会报错。
内容的提问来源于stack exchange,提问作者silence_of_the_lambdas
相关产品推荐
相关产品推荐

