Python 常见问题梳理(1)

-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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章