You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中list.index查找np.nan索引时为何有时抛出ValueError?

问题解答

list.index() 的底层匹配逻辑

Python 内置列表的 index(x) 方法匹配逻辑非常明确,遍历列表中每个元素 elem 时会按顺序执行两个判断:

  • 先做身份判断:如果 elem is x 为真,直接匹配成功,返回当前元素的下标
  • 身份判断不成立时,再做值相等判断:如果 elem == x 为真,同样匹配成功,返回当前元素的下标
  • 所有元素都不满足以上两个条件时,抛出 ValueError 异常

np.nan 查找出现差异的原因

你观察到的现象完全符合上面的匹配规则:

  1. 调用 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 的特性。

  2. 调用 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:48:05