深浅拷贝
深浅拷贝
【一】深浅拷贝问题
给一个列表 基于这个列表进行更改生成新列表
方法1: 复制
对原来的列表不生效
num_list = [1, 2, 3]
num_list_new = [1, 2, 3]
num_list_new.append(4)
print(num_list)
print(num_list_new)
[1, 2, 3]
[1, 2, 3, 4]
方法2:用新的变量名指向原来的列表
对新列表和原来的列表都生效
num_list = [1, 2, 3]
num_list_new = num_list
num_list_new.append(4)
print(num_list)
print(num_list_new)
[1, 2, 3, 4]
[1, 2, 3, 4]
【二】复制原本的列表会产生的问题
新列表是复制出来的副本
【1】修改新列表会影响到原本的列表
----->浅拷贝
【2】修改新列表不会影响原本的列表
----->深拷贝
【三】在python代码中实现深浅拷贝
导入模块
【1】浅拷贝
import copy
# 必须是修改源数据类型中的可变数据类型才生效
# copy.copy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.copy(num_list)
# 当新列表在列表中的可变数据中改变时,旧的列表也会随之改变
num_list_new[4].append(5)
print(num_list_new,id(num_list_new))
print(num_list,id(num_list))
#id 不同 不是同一个列表
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145920
[1, 2, 3, 4, [1, 2, 3, 5]] 1558382145664
# 当新列表在列表中的不可变数据中改变时,旧的列表不会变
num_list_new.append(5)
print(num_list_new,id(num_list_new))
print(num_list,id(num_list))
[1, 2, 3, 4, [1, 2, 3], 5] 1553318834560
[1, 2, 3, 4, [1, 2, 3]] 1553318834304
【2】深拷贝
import copy
# 【2】.深拷贝
# 深拷贝会将原来的列表完全复制一份,不会影响到原先的列表
# copy.deepcopy()
num_list = [1, 2, 3, 4,[1,2,3]]
num_list_new = copy.deepcopy(num_list)
num_list_new[4].append(5)
print(num_list_new,id(num_list_new))
print(num_list,id(num_list))
[1, 2, 3, 4, [1, 2, 3, 5]] 2110769688960
[1, 2, 3, 4, [1, 2, 3]] 2110769688704
【3】总结
-
浅拷贝只会复制顶层对象,而不会影响到深层的可变数据类型
-
在复制出来的列表,列表中的列表引用的是原来列表的引用
-
深拷贝会递归的复制整个对象的数据结构
-
在复制出来的列表,列表中的列表引用的是新列表的引用

- 上为浅拷贝
- 下为深拷贝
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?