实验环境:Python 3.7.5,macOS Mojave 10.14.6
如何理解深拷贝、浅拷贝?
- 深拷贝
递归的拷贝父类及子类,深拷贝的对象与源对象相互独立,没有数据关联
- 浅拷贝
仅拷贝父类,浅拷贝的对象与源对象不一定相互独立,若存在子类,仍然有关联性
与C++中的概念类似。通俗的说,深拷贝就是数据完全独立不共享,单独分配内存;浅拷贝就是部分数据是共享的,比如指针。
python可以通过载入copy模块实现深、浅拷贝,下面通过代码说明两者的区别:
- 深拷贝
In [1]: import copy
In [2]: a = [[1,3],5,7]
In [3]: b = copy.deepcopy(a) # deepcopy()
In [4]: a == b
Out[4]: True
In [5]: a is b
Out[5]: False
In [6]: a.append(9) # 添加父列表数据
In [7]: a
Out[7]: [[1, 3], 5, 7, 9]
In [8]: b
Out[8]: [[1, 3], 5, 7]
In [9]: a[0].append(0) # 添加子列表数据
In [10]: a
Out[10]: [[1, 3, 0], 5, 7, 9]
In [11]: b
Out[11]: [[1, 3], 5, 7]
- 浅拷贝
In [1]: import copy
In [2]: a = [[1,3],5,7]
In [3]: b = copy.copy(a) # copy()
In [4]: a == b
Out[4]: True
In [5]: a is b
Out[5]: False
In [6]: a.append(9) # 添加父列表数据
In [7]: a
Out[7]: [[1, 3], 5, 7, 9]
In [8]: b
Out[8]: [[1, 3], 5, 7]
In [9]: a[0].append(0) # 修改子列表数据
In [10]: a
Out[10]: [[1, 3, 0], 5, 7, 9]
In [11]: b
Out[11]: [[1, 3, 0], 5, 7]
从上面的实验结果看,可以得出以下结论:
若修改父类数据,深、浅拷贝对拷贝对象没有影响
若修改子类数据,深拷贝对拷贝对象没有影响,浅拷贝会同步修改拷贝的对象