深度复制和浅复制的区别是什么?


当前回答

浅拷贝构造一个新的复合对象,并将其对原始对象的引用插入其中。

与浅拷贝不同,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.

其他回答

假设有两个数组arr1和arr2。

arr1 = arr2;   //shallow copy
arr1 = arr2.clone(); //deep copy

The copy constructor is used to initialize the new object with the previously created object of the same class. By default compiler wrote a shallow copy. Shallow copy works fine when dynamic memory allocation is not involved because when dynamic memory allocation is involved then both objects will points towards the same memory location in a heap, Therefore to remove this problem we wrote deep copy so both objects have their own copy of attributes in a memory. In order to read the details with complete examples and explanations you could see the article C++ constructors.

在面向对象编程中,类型包括成员字段的集合。这些字段可以按值或引用(即指向值的指针)存储。

在浅复制中,将创建该类型的新实例,并将值复制到新实例中。引用指针也像值一样被复制。因此,引用指向原始对象。对引用存储的成员的任何更改都同时出现在原始和副本中,因为没有对引用的对象进行复制。

在深度复制中,像以前一样复制按值存储的字段,但不复制按引用存储的对象指针。相反,对引用的对象进行深度复制,并存储指向新对象的指针。对这些引用对象所做的任何更改都不会影响该对象的其他副本。

简单来说,浅拷贝类似于按引用调用,深拷贝类似于按值调用

在引用调用中,函数的形式参数和实际参数都指向相同的内存位置和值。

在按值调用中,函数的形式形参和实际形参都是指不同的内存位置,但具有相同的值。

struct sample
{
    char * ptr;
}
void shallowcpy(sample & dest, sample & src)
{
    dest.ptr=src.ptr;
}
void deepcpy(sample & dest, sample & src)
{
    dest.ptr=malloc(strlen(src.ptr)+1);
    memcpy(dest.ptr,src.ptr);
}