深浅拷贝
【一】深浅拷贝问题
给一个列表 基于这个列表进行更改生成新列表
方法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】总结
-
浅拷贝只会复制顶层对象,而不会影响到深层的可变数据类型
-
在复制出来的列表,列表中的列表引用的是原来列表的引用
-
深拷贝会递归的复制整个对象的数据结构
-
在复制出来的列表,列表中的列表引用的是新列表的引用
![屏幕截图 2024-04-08 151236](C:\Users\jy255\Pictures\Screenshots\屏幕截图 2024-04-08 151236.png)
- 上为浅拷贝
- 下为深拷贝