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

Python迭代更新列表追加存储时如何避免历史值被覆盖

问题根因

Python里列表是可变对象,你用append()或者insert()往theta_history里加元素的时候,塞进去的不是thetas当时值的快照,而是这个列表对象的内存引用。
你的update_thetas函数全程是在原列表上做原地修改,从头到尾thetas指向的都是同一个内存地址的列表,从来没生成过新列表。所以theta_history里存的3个引用,全指向这同一个列表,等你最后打印的时候,所有元素自然都显示成这个列表被改到最后的值。
这个问题和你用append还是insert没有任何关系,只要你传进去的是原列表本身而不是它的副本,就一定会出现这个结果。

修复方案

你的thetas里存的都是整数这种不可变类型,存历史值的时候只需要存thetas的浅拷贝就够了,完全不需要用深拷贝。

具体修改

往历史列表存值时,不要直接传入原列表,换成传入原列表的副本即可,以下任意一种写法都能实现:

  • 调用列表自带的copy方法:theta_history.append(thetas.copy())
  • 用切片语法生成新列表:theta_history.append(thetas[:])
  • 用list构造函数生成副本:theta_history.append(list(thetas))

注意:你当前的代码逻辑是先存值再更新,因此第一个存入的是初始值[10,5]。如果需要历史记录从第一次更新后的结果开始存储,只需要把append操作移动到update_thetas调用之后即可,调整后的代码运行结果完全匹配你给出的预期输出。

符合预期输出的完整代码

def update_thetas(thetas):
    for i in range(len(thetas)):
        thetas[i] = thetas[i] + 1
    print(f"thetas: {thetas}")
    return thetas

thetas = [0] * 2
thetas[0] = 10
thetas[1] = 5
theta_history = []
iterations = 3
for i in range(iterations):
    thetas = update_thetas(thetas)
    # 每次更新完成后存入当前值的副本
    theta_history.append(thetas.copy())
print(f"theta_history: {theta_history}")

运行结果

thetas: [11, 6]
thetas: [12, 7]
thetas: [13, 8]
theta_history: [[11, 6], [12, 7], [13, 8]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:27:29