深拷贝与浅拷贝

  • 浅拷贝

只拷贝父对象,不会拷贝父对象中的子对象。如果该对象没有子对象的话,其浅拷贝和赋值的结果是一样的。浅拷贝可以通过导入copy模块中的copy()方法来完成,或者调用对象本身的copy()方法。例:

import copy # 导入copy模块
a = [1, 2, 3, ['a', 'b', 'c']]
b = copy.copy(a)   # a.copy()
print(id(a), id(b))
print(a is b)
print(a)
print(b)
a.append(4)
print("-----------")
print(id(a), id(b))
print(a)
print(b)
a[3].append('d')
print("-----------")
print(id(a), id(b))
print(a)
print(b)
print(a is b)
print(a[3] is b[3])

通过上述的例子可以看出,我们改变变量a中父对象的值,不会影响变量b,但是改变变量a中子对象的值,那么变量b也会随之改变,这就是浅拷贝,只拷贝父对象,而不拷贝子对象。

image

图解: b = copy.copy(a): 浅拷贝, a 和 b 是一个独立的对象,但它们的子对象还是指向同一对象(内存地址)。

  • 深拷贝

深拷贝,也就是完全拷贝,包括拷贝对象的父对象及其子对象。拷贝后是
两个完全独立的对象,互不影响。我们可以通过copy模块中的deepcopy()方法来完成

import copy

a = [1, 2, 3, ['a', 'b', 'c']]
b = copy.deepcopy(a)
print(id(a), id(b))
print(a is b)
print(a)
print(b)
a.append(4)
print("-----------")
print(id(a), id(b))
print(a)
print(b)
a[3].append('d')
print("-----------")
print(id(a), id(b))
print(a)
print(b)
print(a is b)
print(a[3] is b[3])

通过上述的例子可以看出,不管我们改变变量a中父对象的值,还是改变子对象的值,都不会影响变量b的值,那么说明此时变量a和变量b已经完全独立,这就是深拷贝,拷贝父对象及其子对象。

image

图解: b = copy.deepcopy(a): 深拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

  • 参考文献:

[1] http://blog.csdn.net/sinat_14849739/article/details/78516061

原文地址:https://www.cnblogs.com/LS1314/p/8504709.html