You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不导入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]?

解决方案

当然有,本质是手动实现针对当前场景的深拷贝逻辑,针对二维列表可以用以下几种方式:

  1. 嵌套列表推导式
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的子列表就不会影响原列表的子列表。

  1. 嵌套使用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]

原理和上述方式一致,给每个子列表创建新实例。

  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:55:28