1.拷貝
拷貝實際上其實就是在賦值,比如我們有一個串列L1,定義另一個串列L2參考串列L1,實際上就是在拷貝串列L1的值,由于由于L1串列是可變的資料型別,所以當L1的值變的時候,L2的值也是在跟著變的.那其實就算L1內的是不可變的資料型別,L1的內容變化,L2的內容也一樣會隨之變化的
# # 拷貝(賦值)
# Python學習交流QQ群:153708845
lt = [1, 2, 3]
lt2 = lt
lt.append(4)
print(lt)
# [1, 2, 3, 4]
# 因為串列是可變型別,所以lt的值變化,lt2的值也會跟著變化
print(lt2)
# [1, 2, 3, 4]
2.淺拷貝
淺拷貝時,我們時需要在寫代碼前import.copy,匯入copy的方法,其實串列在記憶體空間里是以索引的形式存在的,索引指向的才是對應的具體的值,那當我們用L2去copy串列L1的時候,那他們兩個串列的索引只想的值都是一樣的,如果L1的某一索引對應的值有變化的時候,L2這個串列是否變化是取決于L1串列變化的那個索引的值是否為可變化資料型別,也就是說當L1串列內的資料是可變化型別的化,L2會隨之變化:L1串列內的資料是不可變的資料型別,那L2串列的資料則不會跟著變化,
# 淺拷貝
# copy.copy()
import copy
l1 = ['xichen','nick','egon',['rockey','pilipili']]
l2 = copy.copy(l1)
l1.append('xuchen')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili'], 'xuchen']
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili']]
l1[-1].append('xucheng')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]
3.深拷貝
深拷貝和淺拷貝一樣,在寫代碼之前需要import.copy匯入copy的方法,但是我們深拷貝的時候用的是deepcopy,其他的語法和淺拷貝是一樣的,但是深拷貝和淺拷貝不一樣的是,深拷貝不管串列L1里面的內容是可變還是不可變的,當L1變化的時候,L2串列里面的資料都不會改變的
import copy
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
# id(lt) 2608713900296
# id(lt[0]) 2608710450544
# id(lt[1]) 2608593350352
# id(lt[2]) 2608594909872
# id(lt[3]) 2608713954696
**************************************************
lt2 = copy.deepcopy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)
# id(lt2) 2608713900616
# id(lt2[0]) 2608710450544
# id(lt2[1]) 2608593350352
# id(lt2[2]) 2608594909872
# id(lt2[3]) 2608713900744
**************************************************
總結:
- 牢記: 拷貝/淺拷貝/深拷貝 只針對可變資料型別
- 拷貝: 當lt2為lt的拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2變化簡單的賦值
- 淺拷貝:當lt2為lt的淺拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2不變化copy.copy() 可變資料的型別中的內置方法.copy()
- 深拷貝: 當lt2為lt的深拷貝物件時,lt內的可變型別變化,lt2不變化;lt內的不可變型別變化,lt2不變copy.deepcopy()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541476.html
標籤:其他
