python深拷貝和淺拷貝的區別
1:在考慮深拷貝和淺拷貝區別之前,我們需要知道python中可變物件和不可變物件
2:淺拷貝和深拷貝區別
淺拷貝
深拷貝#淺拷貝
#1:淺拷貝:可變物件(物件中有不可變資料型別)
#總結:
#拷貝出來的物件和原有物件位址不是同乙個,但是物件中的一一對應元素位址均相同;
#如果是對原物件中可變元素進行值的修改,那麼拷貝物件中響應元素也會被修改
alist =[10
,[123,
345]
]copylist = copy.copy(alist)
#1-1:alist和copylist元素值
(f'alist:'
)#輸出 alist:[10, [123, 345]]
(f'copylist:'
)#copylist:[10, [123, 345]]
#1-2 alist和copylist的id位址不一致
print(id
(alist)
)print(id
(copylist)
)#1-3 alist和copylist中的不可變物件(int型別)id位址一致
print(id
(alist[0]
))print(id
(copylist[0]
))#1-4 alist和copylist中的可變物件(list型別)id位址一致
print(id
(alist[1]
))print(id
(copylist[1]
))#1-5 alist增加元素,copylist並沒有增加元素
'straa'
(f'alist:'
)#輸出alist:[10, [123, 345], 'straa']
(f'copylist:'
)#輸出copylist:[10, [123, 345]]
#1-6 alist中不可變元素改變值,copylist值沒有改變
alist[0]
=1print
(f'alist:'
)#輸出alist:[1, [123, 345], 'straa']
(f'copylist:'
)#輸出copylist:[10, [123, 45]]
alist[1]
2222
(f'alist:'
)#輸出alist:[1, [123, 345, 2222], 'straa']
(f'copylist:'
)#輸出copylist:[10, [123, 345, 2222]]
#2:淺拷貝:不可變物件
#總結:
# 拷貝的是內容,由於是不可變物件,所以,拷貝出來的物件位址和原有位址是相同的。
# 如果原有物件改變了值,那麼變數所改變的位址也就改變了,拷貝物件還是指向原有位址,內容不會改變
bstr =
'abcde'
copybstr = copy.copy(bstr)
#1-1:bstr和copybstr元素值
(f'bstr:'
)#輸出 bstr:abcde
(f'copybstr:'
)#輸出 copybstr:abcde
#1-2 bstr和copybstr的id位址一致
print(id
(bstr)
)print(id
(copybstr)
)#1-3
bstr =
'abcdef'
(f'bstr:'
)#輸出 bstr:abcdef
(f'copybstr:'
)#輸出 copybstr:abcde
3:按照上面執行的操作,可以看出來,不可變物件的深拷貝和淺拷貝沒有什麼區別,有區別的是可變物件,所以在進行操作的時候需要考慮好我們操作的物件是哪一種。#深拷貝
#1:可變物件(物件中有不可變資料型別)
#總結:原有物件和拷貝物件是兩個沒有關係的物件
#拷貝出來的物件和原有物件位址不是同乙個
# 物件中的元素如果是可變資料型別那麼位址不相同,若果元素是不可變資料型別,那麼位址相同(元素值沒有變化);
#如果是對原物件中可變元素進行值的修改,那麼拷貝物件中響應元素不會被修改,因為操作的id位址不同,自然不會被影響
alist =[10
,[123,
345]
]deepcopylist = copy.deepcopy(alist)
#1-1:alist和deepcopylist元素值
(f'alist:'
)#輸出 alist:[10, [123, 345]]
(f'deepcopylist:'
)#deepcopylist:[10, [123, 345]]
#1-2 alist和deepcopylist的id位址,不一致
print(id
(alist)
)print(id
(deepcopylist)
)#1-3 alist和deepcopylist中的不可變物件(int型別)id位址,位址一致
print(id
(alist[0]
))print(id
(deepcopylist[0]
))#1-4 alist和deepcopylist中的可變物件(list型別)id位址,位址不一致
print(id
(alist[1]
))print(id
(deepcopylist[1]
))#1-5 alist增加元素,deepcopylist並沒有增加元素
'straa'
(f'alist:'
)#輸出alist:[10, [123, 345], 'straa']
(f'deepcopylist:'
)#輸出copylist:[10, [123, 345]]
#1-6 alist中不可變元素改變值,deepcopylist元素值沒有改變
alist[0]
=1print
(f'alist:'
)#輸出alist:[1, [123, 345], 'straa']
(f'deepcopylist:'
)#輸出copylist:[10, [123, 345]]
alist[1]
2222
(f'alist:'
)#輸出alist:[1, [123, 345, 2222], 'straa']
(f'deepcopylist:'
)#輸出deepcopylist:[10, [123, 345]]
#2:深拷貝:不可變物件
#總結:
# 拷貝的是內容,由於是不可變物件,所以,拷貝出來的物件位址和原有位址是相同的。
# 如果原有物件改變了值,那麼變數所改變的位址也就改變了,拷貝物件還是指向原有位址,內容不會改變
bstr =
'abcde'
deepcopybstr = copy.deepcopy(bstr)
#1-1:bstr和deepcopybstr元素值
(f'bstr:'
)#輸出 bstr:abcde
(f'deepcopybstr:'
)#輸出 deepcopybstr:abcde
#1-2 bstr和deepcopybstr的id位址一致
print(id
(bstr)
)print(id
(deepcopybstr)
)#1-3
bstr =
'abcdef'
(f'bstr:'
)#輸出 bstr:abcdef
(f'deepcopybstr:'
)#輸出 deepcopybstr:abcde
Python學習筆記 淺拷貝和深拷貝
淺拷貝 兩個指向的記憶體位址相同,指向同乙個記憶體 import copy 測試物件的淺拷貝和深拷貝 class mobilephone def init self,cpu,screen self.cpu cpu self.screen screen class cpu defcalculate s...
筆記 Python深拷貝和淺拷貝
a為已有容器,b作為a的拷貝 淺拷貝 a,b位址不同,a,b中元素的位址是相同的。淺拷貝的特點,只是將容器內的元素位址複製了乙份。如果修改a中的可變型別 a,b中對應元素的位址不變,內容保持一致 如果修改a中的不可變型別 a中對應元素的位址和內容會改變,a,b對應元素位址和內容不同 深拷貝 a,b位...
Python之深拷貝和淺拷貝
賦值,深拷貝和淺拷貝的區別?python中如何拷貝乙個物件?直接賦值 li1 li 只傳遞物件的引用,li1指向物件li的記憶體位址空間,因此,原有列表li改變,被賦值的li1也會做相應的改變.深拷貝 import copy,eg li3 copy.deepcopy li li和li3的記憶體位址不...