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

Python for循环追加列表时所有子列表结果相同的问题

问题根因

Python里列表是可变对象,函数传参时传递的是列表的内存引用,不是列表的完整拷贝。
你的change_w函数全程在传入的原列表上做原地修改,最后返回的也是原列表的引用。三次循环调用时,你每次都把全局的o_list直接传进去,修改的始终是同一块内存里的同一个列表:

  • 循环内print(x)时,你看到的是当前轮次修改完的瞬时值,所以三次打印结果不一样
  • 你append到all_list里的三个值,本质都是同一个o_list的内存引用,没有生成新列表
    等整个循环跑完,o_list停在最后一次修改的最终状态,此时再打印all_list,三个指向同一块内存的引用自然全部显示最后一次的修改结果,看起来三个子列表完全相同。
    你可以在循环内加一行print(id(x))验证,三次输出的内存地址会完全一致。
修复方案

两种改法任选即可,核心逻辑都是保证每次生成独立的新列表对象,不共享同一块内存:

方案1:修改函数逻辑,内部操作副本不修改原入参

进入函数后先拷贝一份传入的列表,所有修改操作在副本上执行,最后返回新副本:

import random

def change_w(w):
    # 生成入参列表的副本,和原列表隔离
    current_w = w.copy()
    for idx in range(len(current_w)):
        current_w[idx] += random.randint(-5, 5)
    return current_w

o_list = [100, 100, 100, 100]
all_list = []
for i in range(3):
    x = change_w(o_list)
    print(x)
    all_list.append(x)
print(all_list)

方案2:不修改原函数,传参时传入原列表的副本

如果你不想调整change_w的现有逻辑,每次调用函数时不要直接传原o_list,而是传它的拷贝即可:

import random

def change_w(w):
    for item in range(len(w)):
        w[item] += random.randint(-5, 5)
    return w

o_list = [100, 100, 100, 100]
all_list = []
for i in range(3):
    # 每次传入原列表的拷贝,原列表不会被修改,每次调用都生成独立新列表
    x = change_w(o_list.copy())
    print(x)
    all_list.append(x)
print(all_list)

提示:上面用的.copy()是浅拷贝,如果你的列表里嵌套了其他可变对象(比如子列表、字典),需要导入copy模块用copy.deepcopy()做深拷贝才能实现完全隔离,当前场景列表元素都是整数,浅拷贝完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:03:39