嵌套循环中列表追加列表出现意外结果的问题排查
嵌套循环列表追加异常问题分析与解决
问题描述
嵌套循环中,内层循环向list_inner添加元素,外层循环将list_inner追加到list_outer。最终list_outer的元素数量符合预期,但所有元素均为list_inner最后一次循环的结果。
原代码
import random list_inner=[] list_outer=[] for i in range(5): for r in range(random.randint(1,10)): list_inner.append(r) print(r) list_outer.append(list_inner) print(list_outer) print(list_outer)
实际部分结果
0 1 2 3 [[0, 1, 2, 3]] 0 1 2 3 4 [[0, 1, 2, 3, 0, 1, 2, 3, 4], [0, 1, 2, 3, 0, 1, 2, 3, 4]]
预期结果
[[0,1,2,3],[0,1,2,3,4], ...] # 每个子列表对应单次内层循环的结果
问题原因
Python中列表是可变对象,执行list_outer.append(list_inner)时,并非复制list_inner的内容添加到list_outer,而是将list_inner对象的引用追加进去。后续内层循环修改list_inner内容时,所有指向该引用的元素都会同步变化,最终list_outer里的所有元素都指向同一个list_inner对象,自然显示的都是最后一次修改后的结果。
解决方案
有两种常用修复方式:
方式1:每次外层循环创建新的list_inner
在外层循环内初始化list_inner,每次循环生成全新的列表对象,避免引用复用:
import random list_outer=[] for i in range(5): list_inner = [] # 每次外层循环创建新列表 for r in range(random.randint(1,10)): list_inner.append(r) print(r) list_outer.append(list_inner) print(list_outer) print(list_outer)
方式2:追加list_inner的副本
若需保留外层循环外的list_inner变量,可在追加时创建列表副本,确保list_outer中的元素是独立对象:
import random list_inner=[] list_outer=[] for i in range(5): list_inner.clear() # 清空原列表内容 for r in range(random.randint(1,10)): list_inner.append(r) print(r) list_outer.append(list_inner.copy()) # 追加列表副本 print(list_outer) print(list_outer)
也可用list(list_inner)或list_inner[:]替代list_inner.copy(),效果一致。
验证效果
修改后,list_outer中的每个子列表对应单次内层循环的结果,不再随list_inner后续修改而变化,符合预期。
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

