Python循环未向列表末尾追加元素反而修改所有元素的问题
问题原因
你遇到的问题核心是列表是可变对象:在Python中执行doptions.append(dvals)时,并没有把dvals的内容复制一份添加到doptions里,而是把dvals这个列表的引用存了进去。后续每次修改dvals的内容时,doptions里所有指向这个引用的元素都会同步变化,最终就只会显示最后一次修改后的结果。
修复方案
每次追加到doptions时,创建dvals的副本而非直接添加引用。常用的列表副本创建方式有三种:
- 列表内置的
copy()方法:dvals.copy() list()构造函数:list(dvals)- 切片语法:
dvals[:]
修复后的代码如下:
doptions = [[]] dvals = [0.2997, 0.29969999999999997, 0.29969999999999997, 0.27372881355932194, 0.0225, 0.29969999999999997, 0.2997, 0.06457182320441988, 0.13706896551724135, 0.29969999999999997, 0.006211180124223601] doptions[0] = dvals.copy() # 初始赋值也改为副本,避免初始元素和后续修改关联 indicator = 0 while indicator < 0.9: dminix = dvals.index(min(dvals)) dvals[dminix] += 0.05 doptions.append(dvals.copy()) # 追加副本而非引用 indicator = min(dvals)
补充说明
- 初始的
doptions[0] = dvals也建议改为副本,否则初始的第一个元素也会和后续修改的dvals关联,同样出现覆盖问题。 - 如果你的列表包含嵌套可变对象(比如子列表),浅拷贝不够,需要用
copy.deepcopy(),但你的场景里都是浮点数,浅拷贝完全足够。
内容的提问来源于stack exchange,提问作者alaskanbullworm
相关产品推荐
相关产品推荐

