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

Python中enumerate遍历二维数组失效但range(len())可正常运行?

问题成因

报错的核心原因是对enumerate()的返回逻辑理解有误:

  • 你写的range(len())版本中,for i in range(len(array))迭代得到的i是纯整数类型的行索引,自然可以直接作为下标访问array[i]、board[i][j]。
  • 但enumerate()迭代任意可迭代对象时,每次返回的是**(索引, 对应位置元素)格式的二元组**,不是单独的整数索引。你写的for i in enumerate(array)中,i拿到的是类似(0, [1,2,3])、(1, [4,5,6])的元组,根本不是合法的列表下标值,执行array[i]时会直接触发TypeError: list indices must be integers or slices, not tuple错误。
  • 内层循环的逻辑有同样的问题:就算外层不报错,for j in enumerate(array[i])拿到的j也是元组,同样不能作为列下标使用。
正确使用enumerate遍历二维数组的方法

根据你是否需要用到索引,选对应写法即可:

不需要索引,仅访问元素值

不需要调用enumerate,直接按行迭代即可,写法最简洁:

for row in array:
    for val in row:
        print(val)

需要同时拿到行索引、列索引和对应值

这是enumerate最适合的场景,注意要把返回的元组拆包为「索引变量」和「元素变量」两部分:

# i为行索引,row为当前行对应的一维数组
for i, row in enumerate(array):
    # j为列索引,val为当前坐标对应的元素值
    for j, val in enumerate(row):
        # 如果需要访问同坐标下board的元素,直接用i、j作为下标即可
        print(board[i][j])
        # 访问当前array的元素直接用val即可,不需要再写array[i][j]
        # print(val)

小提示:enumerate的设计初衷就是减少手动通过索引取值的冗余代码,只要记住「用enumerate就拆包接索引和值」的规则,就不会和range(len())的写法混淆,代码可读性也会比纯索引遍历更高。

内容的提问来源于stack exchange,提问作者Cheesewaffle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:12:29