深浅拷贝

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],所以无论怎样修改原本,副本都不会有任何变化。

posted @ 2022-04-30 17:10  少年不太冷2  阅读(23)  评论(0)    收藏  举报