python的深浅拷贝

浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

地址是完全一致的。

#定义一个列表,第一个元素是可变类型
>>> A = [[2],'fei',90]
#浅拷贝 >>> B = copy.copy(A)
#对象地址是否相同 >>> A is B False
#改变第一个可变类型的值,查看复制对象变化 >>> A[0]= 2 >>> A [[2], 'fei', 90]
#复制对象也跟着改变了 >>> B [[2], 'fei', 90]
#改变第二个不可变类型的值,查看复制对象变化 >>> A[1] = 'anne' >>> A [[2], 'anne', 90]
#复制对象没有改变 >>> B [[2], 'fei', 90]

a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。

#深拷贝
>>> C = copy.deepcopy(A)
#改变第一个元素,查看复制元素变化 >>> A[0]= 3 >>> A [[3], 'fei', 90]
#复制元素不变,对复制元素没影响 >>> C [[1], 'fei', 90]
#改变第二个元素,查看复制元素变化
>>> A[1] = 'Anne' 
>>> A
[[3], 'Anne', 90]

>>> C
[[2], 'fei', 90]

很显然:从数据的不可变而言,浅拷贝是面向不可变类型的;而深拷贝是面向可变类型的处理

注意:这两者与赋值引用不同,在赋值引用中无可变与不可变的类型之分。一旦一个数据改变同类型的也会改变。

原文地址:https://www.cnblogs.com/topass123/p/12735192.html