一 淺拷貝與深拷貝
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方法即可
千萬要注意等號的賦值含義!千萬要注意等號的賦值含義!千萬要注意等號的賦值含義!