一、首先深拷贝和浅拷贝都是对原对象的拷贝,都会生成一个看起来相同的对象,本质区别就是拷贝出来的对象的「地址」是否与原对象一样,即就是对原对象的地址的拷贝,还是值的拷贝
深拷贝:对原对象的地址的拷贝,新拷贝了一份与原对象不同的地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。
浅拷贝:对原对象的值的拷贝,地址仍是一个指针指向原对象的地址,浅拷贝或者原对象的值发生变化,那原对象和浅拷贝对象的值都会随着被改变。
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用
深拷贝(深度克隆):不仅复制对象的基本类,同时也复制原对象的对象,完全是新对象产生的
1.copy.copy 浅拷贝——只拷贝对象,不会拷贝对象的引用对象,不会拷贝原始对象的内部的
2.copy.deepcopy 深拷贝——拷贝对象的值类型,还拷贝了原始对象,而产生了一个新的对象,不仅仅只拷贝了原始对象的引用
二、补充概念:可变对象,不可变对象
可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值
不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改了就是它执行的地址就改变了,相当于将这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了。
区别:可变对象就不会这样会修改值后另存到一个新的地址上,而是直接再原对象的地址上把值给改变了,这个对象依然执行这个地址
本质区别:可变对象修改了值,不会新建一个内存地址的对象,不可变对象如果修改了值,及时复制了一份新的内存地址,原始地址的值不会被改变。
不可变元素包含:int,float,complex,long,str,unicode,tuple
可变原生:list
例子:
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a #赋值,传对象的引用
c = copy.copy(a) #浅拷贝,对象拷贝
d = copy.deepcopy(a) #深拷贝,对象拷贝
a.append(5) #修改对象a,列表末尾添加数字5
a[4].append('c') #修改对象a中的列表['a', 'b']
print 'a= ', a
print 'b= ', b
print 'c= ', c
print 'd= ', d
输出结果:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #修改了原始对象,变为修改后的列表
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #对象的引用,对象的任何值变化都随着变化
c = [1, 2, 3, 4, ['a', 'b', 'c']] #浅拷贝,不可变元素不能改变,可变元素随着原始对的变化而变化了
d = [1, 2, 3, 4, ['a', 'b']] #深拷贝,原始对象的值发生任何变化,深拷贝新的对象内存地址不会发生任何变化
参考:
https://www.cnblogs.com/xiaxiaoxu/p/9742452.html
https://www.huaweicloud.com/articles/794209a39c4555eb5a62145b66b69587.html
版权归原作者 Mielt 所有, 如有侵权,请联系我们删除。