Python 深浅拷贝

浅拷贝

a = [1, 2, 3, 4]
b = b.copy()         # 把 a 列表复制一份
print(b)

b[0] = 5             # 修改 b 列表的中的元素 
print(a)             # 打印 a 列表
print(b)             # 打印 b 列表

运行结果:
Python 深浅拷贝_浅拷贝
我们在这里看到 b 修改的元素并没有影响到 a 列表。

接下来我们把 a 列表的元素改一下再使用 copy 方法:

a = [[1, 2], 3, 4]   # a 列表中包含了一个列表
b = a.copy()
print(b)

b[0][0] = 8          # 修改 b 列表里面的元素
print(a)
print(b)

运行结果:
Python 深浅拷贝_html_02
现在 a,b 列表中的元素都改变了
下面是图解,浅拷贝只是拷贝了列表元素中的第一层,更深层并没有被拷贝。这里 b 拷贝了 a[0] 的内存地址 0088,通过 b[0][0] 修改了元素。a[0],b][0] 的内存地址并没有发生改变。
Python 深浅拷贝_浅拷贝_03
Python 深浅拷贝_浅拷贝_04

深拷贝

import copy
a = [[1, 2], 3, 4]
b = copy.deepcopy(a)
print(b)

b[0][0] = 8
print(a)
print(b)

运行结果:
Python 深浅拷贝_内存地址_05
使用了深拷贝后,对于 b 列表的改变并不会影响到 a 列表。