複製需要區分,,複製的是原始檔的資料,還是指向原始檔資料的位址
1.引用 b=a時,理解為b指向了a指向的資料,相當於引用複製
a=[1,2]b=a#驗證複製的是資料還是位址
#1.檢視ab的位址
id(a) #2677646858824
2. 淺拷貝--copy.copy()
import copy
a=[1,2]
b=[3,4]
c=[a,b]
d=copy.copy(c)
#驗證方法1
id(d) #2677647114120
id(c) #2677644514824
#驗證方法2
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
#驗證方法1
id(d[0]) #2677647113672
id(c[0]) #2677647113672
#驗證方法2
c #[[1, 2, 5], [3, 4]]
d #[[1, 2, 5], [3, 4]]
淺拷貝僅僅把最外面1層進行了copy,並沒有把裡面多層巢狀進行遞迴拷貝,裡面的還是指向原來的位址
3.深拷貝 copy.deepcopy()
import copya=[1,2]
b=[3,4]
c=[a,b]
d=copy.deepcopy(c)
#驗證方法1
id(d) #2677647114120
id(c) #2677644514824
#驗證方法2
c #[[1, 2], [3, 4], 6]
d #[[1, 2], [3, 4]]
#驗證方法1
id(c[0]) #2677647113672id(d[0]) #2677645539912
#驗證方法2
c #[[1, 2, 5], [3, 4]]
d #[[1, 2], [3, 4]]
深拷貝遞迴拷貝, 多層時,每層都拷貝物件的值
4.深拷貝和淺拷貝的應用
a=[1,2]def aa(num):
a #[1, 2]
aa(a)
a #[1, 2, 3]
#如果想不改變源資料需要複製,最好用深複製
aa(copy.deepcopy(a))
a #[1, 2]
5.注意事項
a=(1,2)b=[1,2]
a1=copy.copy(a)
b1=copy.copy(b)
id(a)
#2677645526152
id(a1) #
2677645526152
id(b) #
2677645754888
id(b1) #
2677647113800
#結論:元組即使是1層,copy不拷貝,相當實用"="
#驗證:元組中巢狀列表是都拷貝
a=[1,2]
b=(3,4,a)
b1=copy.copy(b)
id(b)
#2677645507248
id(b1) #
2677645507248
#結論是不拷貝
列表是可變的,,所以可以copy,元祖是不可變的,copy後改變不了,所以copy前後的2個set均不能被修改,但占用了2個空間,,沒有意義但是浪費空間,所以不能copy
a=(1,2)a1=copy.deepcopy(a)
id(a) #2677645531976
id(a1) #2677645531976
a=[1,2]
b=(3,4,a)
b1=copy.deepcopy(b)
id(b) #2677645547848
id(b1) #2677645507896
結論:如果copy的是物件多層巢狀中的物件都不可變,則深拷貝和淺拷貝都失效,僅僅指向引用,如果最外層不可變,內層巢狀中包含可變物件,淺拷貝不拷貝,指向引用,深拷貝進行copy
總結論:
淺拷貝如果最外層是list可變的,淺拷貝只拷貝最外層,內部的指向引用,如果最外層是set不可變的,不論裡面巢狀的可不可變,淺拷貝都不進行copy,只是指向引用
深拷貝如果最外層是list可變的,深拷貝遞迴拷貝,如果最外層是set不可變的,裡面巢狀的包含可變的,深拷貝進行copy,如果裡面巢狀的也無可變的,深copy也不copy
其他如果使用列表的切片,相當於copy.copy() 淺拷貝
如果使用字典中的copy()方法,相當於copy.copy() 淺拷貝
python高階之深拷貝和淺拷貝
a 18b 18id a 結果為4321867632 id b 結果為4321867632c 1 2,3 d 1 2,3 e c id c 結果為4372284616 id d 結果為4371531592 id e 結果為4372284616 這就是python裡面關於變數和引用的關係,如果我們通過...
python 淺拷貝 深拷貝
直接賦值 其實就是物件的引用 別名 淺拷貝 copy 拷貝父物件,不會拷貝物件的內部的子物件。深拷貝 deepcopy copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。usr bin python import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物...
python深拷貝 淺拷貝
在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 alist 1,2,3,...