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}]
过程:此时会发现不管是往,原列表中的一个可变类型中添加一条数据,还是往复制之后的列表中的一个可变类型中添加一条数据;两个列表的数据都会变成一样的
通过图片会发现,相同颜色的数据的地址是相同的;当然不管是深拷贝和浅拷贝,如果数据是不可变类型的,其地址只会是相同的。
浅拷贝总结:浅拷贝的时候只会拷贝其数据的原地址,不会生成新地址
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}]
过程:此时会发现往原列表中的一个可变类型中添加一条数据,只会在原列表中出现不会在复制的列表中出现;同样在复制列表中的一个可变类型中添加一条数据,只会在复制列表中出现不会在原列表中出现。
通过图片会发现,相同颜色的框中的数据储存地址是不一样的,但是其不可变类型的储存地址是一样的;所以当原列表中的可变类型的数据改变的时候,复制列表的数据是不会改变的,因为其储存地址是不一样的;同理在复制列表中的一个可变类型操作时,原列表也不会改变