-1. 深拷贝和浅拷贝原理 import copy a = [1,2,3,4,[‘a’,‘b’]] b = a c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append(‘c’)
首先我们看看看b的情况,b实际上和a指向的是同一个值,就好比人的大名和小名,只是叫法不同,但还是同一个人 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMqgylVh-1593869479531)(https://img-log.csdnimg.cn/20200704213109874.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hcmt3YW5neXU=,size_16,color_FFFFFF,t_70)] 接下来再看看c的情况,c的情况和a.copy()的情况是一样的,都是我们所谓的浅拷贝(浅复制),浅拷贝只会拷贝父对象,不会拷贝子对象,通俗的说就是只会拷贝到第二层 若父对象发生变化,c不会变化,因为它已经复制的所有父对象,假如子对象发生变化则c会变,比如c[4]和a[4]实际都是一个变量list,他们都指向子对象,若子对象发生变化,他们必然都变化,比如变成[“a”,“d”],那它们指向的值也就变成了a、d。 再看看d的情况,这就是我们所说的深复制,不管a进行什么操作,都不会改变d了,他们已经指向不同的值(这里是指在内存中存储的位置不同了)。 总结: b=a,只是换了一个名字,a怎么变b就怎么变, c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d
