深浅拷贝
1、首先说一下深浅拷贝的结论:
浅拷贝是拷贝外层容器(即非嵌套)的内容,内层容器(即嵌套)的引用地址;
深拷贝是拷贝外层容器和内层容器的内容;
深拷贝只有在嵌套的子容器对象内使用才有意义。
浅拷贝Code:
dic = {'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 3]}
dic_new = dic.copy()
print(id(dic))
print(id(dic_new))
dic['key3'][2] = 5
print(dic)
print(dic_new)
Output:
1941587640136
1941587640216
{'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 5]}
{'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 5]}
深拷贝Code:
import copy
dic = {'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 3]}
dic_new = copy.deepcopy(dic)
print(id(dic))
print(id(dic_new))
dic['key3'][2] = 5
print(dic)
print(dic_new)
Output:
1259509923656
1259512646136
{'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 5]}
{'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 3]}
不难看出:
浅拷贝时,对字典中的列表元素进行修改的话,拷贝得到的副本跟着改变,得到修改后的值;
深拷贝时,对字典中的列表元素进行修改的话,拷贝得到的副本不变,仍是之前的值。
2、原理:
dic = {'key1': 'val1', 'key2': 'val2', 'key3': [1, 2, 3]}
[1, 2 ,3]的内存地址假设为001
浅拷贝得到的副本中,只拷贝了内层容器(即[1, 2, 3])的内存地址001,所以当原本中的 [1, 2 ,3]被修改为[1, 2 ,5]时,副本中的内存容器也跟着变了,因为指向的内存地址没有变;
深拷贝得到的副本中,拷贝的是内层容器的内容,也就是[1, 2, 3],所以无论怎样修改原本,副本都不会有任何变化。

浙公网安备 33010602011771号