Python如何拷贝嵌套列表并修改副本而不改变原列表?
问题原因
list.copy()执行的是浅拷贝操作:仅复制最外层的列表容器,列表中存储的嵌套子列表并没有被创建新副本,新旧外层列表里的子列表指向内存中完全相同的对象。此时你遍历修改子列表内的元素,本质是在修改两个外层列表共同引用的同一个子列表,因此原列表startTimeList会被同步改动。
实现方法
以下两种方案都可以得到你期望的结果,按需选择即可:
- 方案1:深拷贝(适配任意复杂嵌套结构)
使用copy模块的deepcopy方法,会递归复制所有层级的嵌套对象,拷贝完成后两个列表完全独立,修改互不影响:
import copy startTimeList = [[0, 0], [2, 0], [4, 0], [6, 0], [8, 0], [10, 0], [12, 0], [14, 0], [16, 0], [18, 0], [20, 0], [22, 0]] flowDuration = 10 endTimeList = copy.deepcopy(startTimeList) for sub_list in endTimeList: sub_list[1] = flowDuration print("startTimeList:", startTimeList) print("endTimeList:", endTimeList)
- 方案2:列表推导式生成新列表(适配当前固定结构,更轻量无依赖)
遍历原列表时直接构造全新的子列表,不需要导入额外模块,执行效率更高:
startTimeList = [[0, 0], [2, 0], [4, 0], [6, 0], [8, 0], [10, 0], [12, 0], [14, 0], [16, 0], [18, 0], [20, 0], [22, 0]] flowDuration = 10 endTimeList = [[time, flowDuration] for time, _ in startTimeList] print("startTimeList:", startTimeList) print("endTimeList:", endTimeList)
两种代码运行后输出均为:
startTimeList: [[0, 0], [2, 0], [4, 0], [6, 0], [8, 0], [10, 0], [12, 0], [14, 0], [16, 0], [18, 0], [20, 0], [22, 0]] endTimeList: [[0, 10], [2, 10], [4, 10], [6, 10], [8, 10], [10, 10], [12, 10], [14, 10], [16, 10], [18, 10], [20, 10], [22, 10]]
内容的提问来源于stack exchange,提问作者HTTP ERROR 500
相关产品推荐
相关产品推荐

