深拷贝和浅拷贝需要注意的地方就是:可变元素的拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别 。
浅拷贝
使用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×tamp=1618795789&ver=3017&signature=ON7jaX30DZUR5dcPerCwhirHixtLA5ZXPFrXDm86cQDc-f2qx3lbn4QAh1dPr*S9JZTbHJVcf9c4wbChHxsv2W0ub52NJtDewYLHgPsH2PJFDnuC*1eruoNl8u5fWTlN&new=1