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

Python嵌套列表动态访问元素触发IndexError报错问题求解

问题排查与修复方案

核心错误原因

  • 可变对象传引用导致索引轨迹被篡改:daccess函数中执行indices.pop(1)会直接修改fnc遍历过程中全局维护的索引轨迹列表lst,Python中列表是可变对象,函数传参为引用传递而非值拷贝。你单独调用daccess时传入的是独立的列表副本,因此运行正常,但嵌套遍历过程中同一个列表被daccess修改后,后续fnc的append、pop逻辑完全混乱,最终触发pop索引超出范围的报错。
  • 递归参数传递逻辑错误:fnc递归时将子容器elt作为新的s传入下一层,但daccess的设计逻辑是接收最外层根容器+全量索引轨迹来定位元素,两者逻辑不匹配。
  • 可变默认参数陷阱:fnc的默认参数lst=[0]属于Python典型的可变默认参数问题,所有不传入lst的调用都会复用同一个列表对象,且初始索引轨迹的[0]前缀属于冗余无效值。

修复后的代码

方案1:保留原设计逻辑,修复参数问题

# 新增root参数存储最外层根容器,避免递归时被替换
def fnc(s, d=0, lst=None, root=None):
    # 初始化默认参数,规避可变默认参数坑
    if lst is None:
        lst = []
    if root is None:
        root = s
    if isinstance(s, (tuple, list)):
        for i, elt in enumerate(s):
            if isinstance(elt, int):
                # 传入索引轨迹的副本,避免修改原始遍历状态
                daccess(root, d, i, lst.copy())
            else:
                lst.append(i)
                fnc(elt, d+1, lst, root)
                lst.pop(-1)

def daccess(lst, d, i, indices):
    if d == 0:
        print(lst[i])
    else:
        # 修正pop索引,取当前层级的第一个索引值
        lst_index = lst[indices.pop(0)]
        daccess(lst_index, d-1, i, indices)

方案2:简化冗余逻辑

遍历到整数元素时可直接打印,无需再通过索引回查元素,代码更简洁高效:

def fnc(s):
    if isinstance(s, (tuple, list)):
        for elt in s:
            if isinstance(elt, int):
                print(elt)
            else:
                fnc(elt)

验证说明

使用你提供的测试结构s运行修复后的代码,会依次打印所有嵌套的整数元素,不会再抛出索引错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:15:02