Fork me on GitHub

学习python -- 第016天 浅拷贝和深拷贝

深拷贝和浅拷贝需要注意的地方就是:可变元素的拷贝

 

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别 。

 

浅拷贝

 

使用copy模块里面的copy方法实现。

改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;

改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

 1 #
 2 # @author:浊浪
 3 # @version:0.1
 4 # @time: 2021/4/19 9:35
 5 # 
 6 import copy
 7 #定义一个列表,其中第一个元素是可变类型。
 8 list1 = [[1,2], 'fei', 66];
 9 #进行浅copy
10 list2 = copy.copy(list1);
11 
12 #对象地址是否相同。
13 print(id(list1));
14 print(id(list2));
15 #结果:不同
16 46177816
17 46177936
18 
19 #第一个元素地址是否相同。
20 print(id(list1[0]));
21 print(id(list2[0]));
22 #结果:相同
23 46240432
24 46240432
25 
26 #第二个元素地址是否相同。
27 print(id(list1[1]));
28 print(id(list2[1]));
29 #结果:相同
30 45547328
31 45547328
32 
33 
34 #改变第一个值,查看复制对象变化。
35 list1[0][0] = 2;
36 print(list2);
37 #结果:复制对象发生变化
38 [[2, 2], 'fei', 66]
39 
40 #改变第二个值,查看复制对象变化。
41 list1[1] = 'ge';
42 print(list2);
43 #结果:复制对象没发生变了
44 [[2, 2], 'fei', 66]

 

 

深拷贝

 

copy模块里面的deepcopy方法实现。

深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。

原始对象和拷贝对象所有的可变元素地址都不一样了。

 1 #
 2 # @author:浊浪
 3 # @version:0.1
 4 # @time: 2021/4/19 9:36
 5 # 
 6 import copy
 7 #定义一个列表,其中第一个元素是可变类型。
 8 list1 = [[1,2], 'fei', 66];
 9 #进行深copy
10 list2 = copy.deepcopy(list1);
11 
12 #对象地址是否相同。
13 print(id(list1));
14 print(id(list2));
15 #结果:不同
16 46177816
17 46177936
18 
19 #第一个元素地址是否相同。
20 print(id(list1[0]));
21 print(id(list2[0]));
22 #结果:不同
23 49123856
24 49588784
25 
26 #第二个元素地址是否相同。
27 print(id(list1[1]));
28 print(id(list2[1]));
29 #结果:相同
30 45547328
31 45547328
32 
33 #改变第一个值,查看复制对象变化。
34 list1[0][0] = 2;
35 print(list2);
36 #结果:复制对象没发生变了
37 [[1, 2], 'fei', 66]
38 
39 #改变第二个值,查看复制对象变化。
40 list1[1] = 'ge';
41 print(list2);
42 #结果:复制对象没发生变了
43 [[1, 2], 'fei', 66]

 

参考:https://mp.weixin.qq.com/s?src=11&timestamp=1618795789&ver=3017&signature=ON7jaX30DZUR5dcPerCwhirHixtLA5ZXPFrXDm86cQDc-f2qx3lbn4QAh1dPr*S9JZTbHJVcf9c4wbChHxsv2W0ub52NJtDewYLHgPsH2PJFDnuC*1eruoNl8u5fWTlN&new=1

posted @ 2021-04-19 09:40  走位,走位  阅读(56)  评论(0)    收藏  举报