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运行上述任意一版修正后的代码,输出完全符合预期:
- 第一次打印full_subs输出
[['A', 'A', 'B']] - 第二次打印full_subs输出
[['A', 'A', 'B'], ['C', 'A', 'A']] - 第三次打印full_subs输出
[['A', 'A', 'B'], ['C', 'A', 'A'], ['A', 'D', 'A']]
内容的提问来源于stack exchange,提问作者Gl1tch1e
相关产品推荐
相关产品推荐

