python之深拷贝和浅拷贝

1.变量名赋值的过程是一个 “指向” 过程

2. 先 import copy ,通过 a = copy.copy(b) 方法拷贝,就是浅拷贝

3.通过 a = copy.deepcopy(b)方法拷贝,就是深拷贝

4. 切片操作、字典自带的copy()方法和函数实参传给形参的过程,都是浅拷贝


那么,什么是深拷贝,什么是浅拷贝呢?

深拷贝:递归拷贝所有引用指向的数据和数据里面的引用指向的数据,该方法在拷贝时,如果拷贝的内容只有不可变数据,那就和赋值效果一样,但是如果包含有可变数据类型时,就会递归拷贝所有引用指向的数据和数据里面的引用指向的数据


浅拷贝:只拷贝引用指向的数据,但是不再拷贝数据里面的引用指向的数据,该方法在拷贝不可变数据类型【最外层】时都是只拷贝引用指向的数据,但是不再拷贝数据里面的引用指向的数据,和赋值效果一样, 切片、字典自带的copy()方法和函数实参传递到形参的过程 都是浅拷贝


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import copy

a = [1, 2]
a1 = [3, 4]
aa = [a, a1]
b = aa # 普通赋值,b 指向 a
c = copy.deepcopy(aa)
d = copy.copy(aa)
a.append(3) #改变a的值
print(aa)
print(b)
print(c)
print(d)

运行结果:

1
2
3
4
[[1, 2, 3], [3, 4]]  # aa的值也改变了
[[1, 2, 3], [3, 4]] # b的值也跟着和aa一样
[[1, 2], [3, 4]] # 深拷贝的并没有改变
[[1, 2, 3], [3, 4]] # 浅拷贝的改变了