一 浅拷贝与深拷贝
1. 浅拷贝
浅拷贝只复制了对象本身(即c++中的引用)。
2. 深拷贝
深拷贝创建一个新的对象,同时也会创建所有子对象的副本,因此新对象与原对象之间完全独立。
二 代码理解
1. 案例一
a = 10
b = a
b = 20
print(a)
10
通过案例可以看出,a并没有改变值,因为a是数字,不可改变的,这里b=a并不是引用,所以不能改变。
2. 案例二
a = [1, 25, 60, 87, 100]
b = a
b[2] = 2
print(a)
[1, 25, 2, 87, 100]
通过案例可以看出,a的值发生改变了,因为a是list,是可以改变的,所以b=a是引用,所以发生了改变。
3. 案例三
import copy
a = [1, 25, 60, 87, 100]
b = copy.deepcopy(a)
b[2] = 2
print('a : ', a)
print('b : ', b)
a : [1, 25, 60, 87, 100]
b : [1, 25, 2, 87, 100]
通过案例可以看出,a并没有改变值,因为我使用了深拷贝,所以不发生改变。
4. 案例四
import numpy as np
a = np.array([1, 2, 3, 4])
b = a
b[1] = 0
print(a)
[1 0 3 4]
通过案例可以看出,a的值发生改变了,因为a是np,是可以改变的,所以b=a是引用,所以发生了改变。
5. 案例五
import numpy as np
a = np.array([1, 2, 3, 4])
b = a.copy()
b[1] = 0
print('a : ', a)
print('b : ', b)
a : [1 2 3 4]
b : [1 0 3 4]
通过案例可以看出,a并没有改变值,因为我使用了深拷贝,所以不发生改变。
三 总结
我们通过案例发现,只要是python可变的变量,如果使用=号赋值,就是引用,不可变的,就不是引用。当使用可变数据时候需要深拷贝才能解决问题。
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)。
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)
np也是可变数据,但是使用深拷贝是copy方法即可
千万要注意等号的赋值含义!千万要注意等号的赋值含义!千万要注意等号的赋值含义!