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
相关产品推荐
相关产品推荐

