Python中追加到列表的元素会动态变化是什么原因?该如何解决?
问题原因
Python中的列表是可变对象,你执行list(cells)仅对cells做了浅拷贝:仅生成了新的外层列表对象,外层列表中存储的还是原cells内部子列表的引用。后续循环修改cells内部子列表的坐标值时,steps中存储的浅拷贝结果因为共享子列表的内存地址,也会同步被修改,最终出现所有追加的元素都同步更新为最新cells值的问题。
解决方法
共有两种常用修复方案:
- 手动实现嵌套拷贝:将
steps.append(list(cells))替换为steps.append([list(sub) for sub in cells]),逐个复制内部的坐标子列表,保证所有存入steps的对象都是独立的。 - 使用标准库深拷贝:导入
copy模块后,使用steps.append(copy.deepcopy(cells))实现全结构独立拷贝,适合嵌套层级更多、结构更复杂的场景。
修复后完整代码示例
import random cells = [[i, i] for i in range(3)] steps = [] for t in range(2): for i in range(len(cells)): xrand = random.randint(-5, 5) yrand = random.randint(-5, 5) cells[i][0] += xrand cells[i][1] += yrand # 替换为嵌套拷贝逻辑 steps.append([list(sub) for sub in cells]) print(steps)
运行上述代码即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Anthony Guterres
相关产品推荐
相关产品推荐

