深度复制和浅复制的区别是什么?
当前回答
浅拷贝构造一个新的复合对象,并将其对原始对象的引用插入其中。
与浅拷贝不同,deepcopy构造新的复合对象,并插入原复合对象的原对象副本。
让我们举个例子。
import copy
x =[1,[2]]
y=copy.copy(x)
z= copy.deepcopy(x)
print(y is z)
上面的代码输出FALSE。
让我们看看怎么做。
原始复合对象x=[1,[2]](称为复合,因为它在对象中有对象(Inception))
如图所示,列表中有一个列表。
然后使用y = copy.copy(x)创建它的浅拷贝。python在这里所做的是,它将创建一个新的复合对象,但其中的对象指向原始对象。
在图像中,它为外层列表创建了一个新的副本。但内部列表与原始列表保持一致。
现在我们使用z = copy.deepcopy(x)创建它的深度复制。python在这里所做的是,它将为外部列表和内部列表创建新对象。如下图所示(红色高亮部分)。
最后代码输出False,因为y和z不是相同的对象。
HTH.
其他回答
试着考虑下面的图像
例如Object。memberwisclone创建一个浅复制链接
并使用ICloneable接口,你可以得到深度拷贝,如这里所述
简单来说,浅拷贝类似于按引用调用,深拷贝类似于按值调用
在引用调用中,函数的形式参数和实际参数都指向相同的内存位置和值。
在按值调用中,函数的形式形参和实际形参都是指不同的内存位置,但具有相同的值。
假设有两个数组arr1和arr2。
arr1 = arr2; //shallow copy
arr1 = arr2.clone(); //deep copy
尤其是iOS开发者:
如果B是a的浅拷贝,那么对于原语数据,它就像B = [a assign];对于对象,B = [A retain];
B和A指向同一个内存位置
如果B是a的深层副本,则B = [a copy];
B和A指向不同的内存位置
B的内存地址与A的相同
B和A的含量相同
浅克隆: 定义:“对象的浅拷贝复制‘主’对象,但不复制内部对象。” 当一个自定义对象(例如。雇员)只有原始的,字符串类型的变量,然后你使用浅克隆。
Employee e = new Employee(2, "john cena");
Employee e2=e.clone();
返回super.clone();在重写的clone()方法中,您的工作就结束了。
深克隆: 定义:“与浅拷贝不同,深拷贝是对象的完全独立副本。” 表示当一个Employee对象持有另一个自定义对象时:
Employee e = new Employee(2, "john cena", new Address(12, "West Newbury", "Massachusetts");
然后,您必须在覆写的clone()方法中编写代码来克隆'Address'对象。否则Address对象不会被克隆,当你在克隆的Employee对象中改变Address的值时,它会导致一个错误,这也反映了原始的一个。