如何在不导入copy.deepcopy的情况下深拷贝Python列表?
问题背景
先看这段代码的执行效果:
x = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] b = x[:] b[1].append(99) print(x[1])
执行后输出 x[1]=[1, 2, 3, 99]
以下几种浅拷贝方式都会得到相同结果:
- 使用列表内置的
.copy()方法:b=x.copy(),执行后x[1]=[1, 2, 3, 99] - 使用
list()构造函数:b = list(x),执行后x[1]=[1, 2, 3, 99] - 使用列表推导式:
b=[i for i in x],执行后x[1]=[1, 2, 3, 99]
只有导入copy模块使用深拷贝:import copy,b=copy.deepcopy(x)时,修改b[1]才不会影响原列表,此时x[1]=[1, 2, 3]
提问:是否存在不导入deepcopy()的方法,使x[1]保持为[1, 2, 3]?
解决方案
当然有,本质是手动实现针对当前场景的深拷贝逻辑,针对二维列表可以用以下几种方式:
- 嵌套列表推导式
x = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] b = [item[:] for item in x] b[1].append(99) print(x[1]) # 输出 [1, 2, 3]
对原列表中的每个子列表做切片拷贝,给每个子列表创建新引用,修改b的子列表就不会影响原列表的子列表。
- 嵌套使用
list()构造函数
x = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] b = [list(item) for item in x] b[1].append(99) print(x[1]) # 输出 [1, 2, 3]
原理和上述方式一致,给每个子列表创建新实例。
- 使用
map()配合list()
x = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] b = list(map(list, x)) b[1].append(99) print(x[1]) # 输出 [1, 2, 3]
map(list, x)会把每个子列表转换为新的列表对象,再转为外层列表,同样实现二维列表的深拷贝效果。
注意:这些方法仅适用于子元素为不可变类型的二维列表,如果列表嵌套层级更深(如三维及以上),这类方式就不再适用,此时仍需copy.deepcopy()或手动递归实现深层拷贝。
内容的提问来源于stack exchange,提问作者bbiot426
相关产品推荐
相关产品推荐

