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

Python追加列表至嵌套列表时得到全空子列表问题排查

问题根源

Python中列表属于引用类型,执行full_subs.append(subs)时,追加到外层列表的不是subs当前存储内容的独立副本,而是subs这个列表对象本身的引用。你在循环外只创建了1个subs列表,循环过程中三次append到full_subs的元素,本质上全是指向这同一个subs列表的指针。
后续调用subs.clear()会直接清空这唯一的subs列表里的所有内容,之前已经append到full_subs里的引用指向的内容自然也同步变成空,最终打印出来就全是空列表。

修复方法

二选一即可:

  • 方法1:追加时存入subs的内容副本,不直接存原列表引用
    把full_subs.append(subs)替换为full_subs.append(subs.copy()),也可以用切片写法full_subs.append(subs[:])实现同样效果。这样每次存到外层列表的是当前subs内容的独立快照,后续清空原subs不会影响已经存好的内容。
    修正后的对应代码:
    def merge_the_tools(string, k):
        slist = list(string.strip())
        subs = []
        full_subs = []
        for i in range(0, len(string), k):
            for j in range(i, i+k):
                subs.append(slist[j])
            print(subs)
            full_subs.append(subs.copy()) # 追加内容副本
            subs.clear()
            print(full_subs)
    
  • 方法2:不要复用同一个subs列表,每次处理分段时新建空列表
    把subs的初始化移到外层for循环内部,每处理一个新分段就创建一个全新的空列表,不需要再调用clear()。由于每个分段用的都是独立的新列表,不存在多个引用指向同一个列表的问题,自然不会出现内容被同步清空的情况。
    修正后的对应代码:
    def merge_the_tools(string, k):
        slist = list(string.strip())
        full_subs = []
        for i in range(0, len(string), k):
            subs = [] # 每次循环新建独立的空列表
            for j in range(i, i+k):
                subs.append(slist[j])
            print(subs)
            full_subs.append(subs)
            print(full_subs)
    
效果验证

用测试输入string="AABCAAADA", k=3运行上述任意一版修正后的代码,输出完全符合预期:

  1. 第一次打印full_subs输出[['A', 'A', 'B']]
  2. 第二次打印full_subs输出[['A', 'A', 'B'], ['C', 'A', 'A']]
  3. 第三次打印full_subs输出[['A', 'A', 'B'], ['C', 'A', 'A'], ['A', 'D', 'A']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:48:46