python深拷贝和浅拷贝


1、在了解深拷贝和浅拷贝之前,需要知道,可变类型和不可变类型

可变类型:列表,字典,集合

不可变类型:字符串,数字,元组

2、假设一个列表

list1 = [[1, 2, 3, 4], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]


import copy

#浅拷贝:

copy_list = copy.copy(list1)

copy_list[0].append(‘add_str1’)

print(list1)

打印结果:[[1, 2, 3, 4, add_str1], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

list1[0].append(‘add_str2’)

print(copy_list)

打印结果:[[1, 2, 3, 4, add_str1, add_str2], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

过程:此时会发现不管是往,原列表中的一个可变类型中添加一条数据,还是往复制之后的列表中的一个可变类型中添加一条数据;两个列表的数据都会变成一样的

python深拷贝和浅拷贝_浅拷贝


通过图片会发现,相同颜色的数据的地址是相同的;当然不管是深拷贝和浅拷贝,如果数据是不可变类型的,其地址只会是相同的。


浅拷贝总结:浅拷贝的时候只会拷贝其数据的原地址,不会生成新地址

list2 = [[11, 22, 33, 44], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

#深拷贝:

deepcopy_list = copy.deepcopy(list2)

deepcopy_list[0].append(‘add_str1’)

print(deepcopy_list)

打印结果:[[1, 2, 3, 4, add_str1], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

print(list2)

打印结果:[[1, 2, 3, 4], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

list2[0].append(‘add_str2’)

print(deepcopy_list)

打印结果:[[1, 2, 3, 4, add_str1], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

print(list2)

打印结果:[[1, 2, 3, 4, add_str2], ‘a’, ‘b’, {‘aa’: 980, ‘sad’: 87}, (213, ‘adsa’), {1, 2}]

过程:此时会发现往原列表中的一个可变类型中添加一条数据,只会在原列表中出现不会在复制的列表中出现;同样在复制列表中的一个可变类型中添加一条数据,只会在复制列表中出现不会在原列表中出现。

python深拷贝和浅拷贝_浅拷贝_02


通过图片会发现,相同颜色的框中的数据储存地址是不一样的,但是其不可变类型的储存地址是一样的;所以当原列表中的可变类型的数据改变的时候,复制列表的数据是不会改变的,因为其储存地址是不一样的;同理在复制列表中的一个可变类型操作时,原列表也不会改变