定義:所謂淺拷貝就是對引用的拷貝;
所謂深拷貝就是對物件的資源的拷貝。
1、對於直接賦值(=),有如下三點認識:
1)、賦值是將乙個物件的位址賦值給乙個變數,讓變數指向該位址(舊瓶裝舊酒)。
2)、修改不可變物件(str、tuple)需要開闢新的空間
3)、修改可變物件(list等)不需要開闢新的空間
#對於賦值運算,就是指向同乙個記憶體位址.s1 = 'alex'
s2 = s1
print(s1, id(s1)) #alex 1996081840344
print(s2, id(s2)) #alex 1996081840344
#當s1的值修改時,記憶體位址也發生了變化s1 = 'alex'
print(s1, id(s1)) #alex 1515050615000
s1 = 'alex2'
print(s1, id(s1)) #alex 1515051454624
#當列表l1新增乙個值,其記憶體位址不變l1 = [1,2,3]
l2 = l1
print(l1, id(l1)) #[1, 2, 3] 1730542337864
print(l2, id(l2)) #[1, 2, 3] 1730542337864
print(l1, id(l1)) #[1, 2, 3, 4] 1730542337864
print(l2, id(l2)) #[1, 2, 3, 4] 1730542337864
2、copy淺拷貝,只拷貝父物件,沒拷貝子物件,所以原始資料改變,子物件會改變
#切片賦值相當於淺copy,只拷貝值,不拷貝記憶體位址l1 = [1,2,3]
l2 = l1[:]
print(l1, id(l1)) #[1, 2, 3] 2685913624392
print(l2, id(l2)) #[1, 2, 3] 2685913645192
print(l1, id(l1)) #[1, 2, 3, 4] 2685913624392
print(l2, id(l2)) #[1, 2, 3] 2685913645192
#只拷貝父物件第一次的值,不拷貝記憶體位址l1 = [1,2,3]
l2 = l1.copy()
print(l1, id(l1)) #[1, 2, 3, 666] 2170284179272
print(l2, id(l2)) #[1, 2, 3] 2170284195976
#對於淺copy來說,第一層都是獨立的記憶體位址,從第二層開始,都是指向同乙個記憶體位址,一變都變l1 = [1,2,3,[22,33]]
l2 = l1.copy()
print(l1, id(l1)) #[1, 2, 3, [22, 33, 666]] 1643848253576
print(l2, id(l2)) #[1, 2, 3, [22, 33, 666]] 1643848253704
3、deepcopy深拷貝,包含父物件及其子物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變
#對於深copy來說,無論多少層,在記憶體中都是兩個獨立的記憶體位址import copy #引入copy模組
l1 = [1,[22,33]]
l2 = copy.deepcopy(l1)
print(l1, id(l1), id(l1[1])) #[1, [22, 33, 66], 77] 1756548727112 1756548726920
print(l2, id(l2), id(l2[1])) #[1, [22, 33]] 1756548728392 1756548728328
總結:
1、深淺拷貝都是對源物件的複製,占用不同的記憶體空間。
2、不可變型別(數字、字串、元組)的物件,對於深淺拷貝毫無影響,最終的位址值和值都是相等的。
3、可變型別(列表、字典):
copy淺拷貝:值相等,位址不相等
deepcopy深拷貝:值相等,位址不相等
python 中的拷貝 淺拷貝與深拷貝
0.序列指什麼?序列型別是指容器內的元素從0開始的索引順序訪問,一次可以訪問乙個或者多個元素,包括字串 string 元組 tuple 列表 list the difference between tuple and list tuple would not be changed,but list ...
python中淺拷貝與深拷貝
淺拷貝,拷貝的是父物件,不會拷貝到內部的子物件。單從乙個淺字就可以看出他拷貝的東西不深,可以理解為只拷貝一層 import copy a 1,ss 2,3 b copy.copy a print b print id a print id b 現在有乙個列表a裡面有數字,字串,列表和字典 用淺拷貝的...
Python中的淺拷貝與深拷貝
1.淺拷貝 情況1的例項如下 import copy a 1,2 b 3,4 c a,b 注意這裡的c就是乙個可變物件!d copy.copy c print 變數c c print print 變數d d 結果 變數c 1,2 3,4 變數d 1,2 3,4 原因分析 需要拷貝的物件c是乙個lis...