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

嵌套循环中列表追加列表出现意外结果的问题排查

嵌套循环列表追加异常问题分析与解决

问题描述

嵌套循环中,内层循环向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:13