前言
每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~
如果要了解copy与deepcopy的区别,就需要了解Python的存储机制;Python在赋值会在内存里开辟一个空间来存放值这就叫“内存地址”,同时会开辟一个空间来存放名字叫命名,在数据相同长度在一定范围、且数据为不可变类型时,Python的内部会有节省内存机制让几个变量名指向同一个内存地址,当然这个就不存在什么深浅拷贝了hhh~,来说说可变类型吧,一般浅拷贝是对最外层的数据进行拷贝,也就是开辟一个新的内存空间来存储,而对内层的数据进行内存地址的引用,而深拷贝则是将原数据所有数据重新存储到一个新的内存空间中。反正记住一点,在多个变量引用同一个内存地址的可变数据时,无论是对哪个变量进行修改,其余的值也会随之变化。
浅拷贝
无论多复杂的数据都只复制最外层的数据,对内层数据对象的内存地址进行引用。
import copy list1 = ['我是第一层', ["我是第二层", ["我是第三层", ]]] list2 = copy.copy(list1) # 查看内存地址是否相同 print(id(list1), id(list2)) # 39613704 39613768 # 这时你发现哇,内存地址不一样是不是代表着这两个数据就完全没关系了,那我们修改其中一个试试 list1.append("改改数据") print(list1) # ['我是第一层', ['我是第二层', ['我是第三层']], '改改数据'] print(list2) # ['我是第一层', ['我是第二层', ['我是第三层']]] # 你会发现还是不同,我们想想前言说的,浅拷贝是对最外层的数据创建一个新的内存空间来存储,而对内层的内存地址进行引用 list1[1].append("改改数据") print(list1) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据'], '改改数据'] print(list2) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据']] # 果然,在修改list1第二层数据的时候,list2也随之改变了,由此可以验证我们说的是正确的
深拷贝
完全复制原来变量的所有数据,在内存中开辟一个新的内存地址。
.....我就不写例子了
list2 = copy.deepcopy(list1)
list1无论如何修改,对list2都无法照成任何影响