python中的複製與拷貝
阿新 • • 發佈:2018-12-15
python中的複製分為深拷貝和淺拷貝,適用於python中的任何組合物件
賦值:簡單拷貝物件的引用,兩個物件的id相同。
深拷貝:能夠拷貝物件內部所有資料和引用,兩個物件的id不同,引用相當於C語言中的指標概念,但python中不存在指標,但是變數的記憶體結構是通過引用來維護的。
淺拷貝:並不複製物件內部的所有引用,只複製所有資料,兩個物件id不同。
說明:
深拷貝和淺拷貝的不同僅僅是對於組合物件而言的,所謂的組合物件就是包含了其他物件的物件,例如,列表,元組,字典,類例項等又包含了這些資料型別。對於數字,字串,以及其他“原子”型別,例如,列表中只包含數字或者字串等,沒有深淺拷貝一說。
常見的淺拷貝有:切片操作,工廠函式(list,str,tuple),物件的copy()方法,copy模組中的copy函式。
可使用copy模組來實現組合物件的深拷貝{------deepcopy()------}和淺拷貝{------copy()------}。
舉例說明:
#python中的複製與拷貝
#原子型別
#賦值
L1=[1,2,3,4,5]
L2=L1
print(id(L1),id(L2))
L2[0]='a'
print(L1,L2)
輸出結果如下:
#copy L3=L1.copy() print(id(L1),id(L3)) L3[0]='b' print(L1,L3)
輸出:
#遍歷賦值
L4=L1[:]
print(id(L1),id(L4))
L4[0]='c'
print(L1,L4)
輸出:
#deepcopy與copy
import copy
L5=copy.copy(L1)
print(id(L1),id(L5))
L5[0]='d'
print(L1,L5)
輸出:
L6=copy.deepcopy(L1)
print(id(L1),id(L6))
L6[0]='e'
print(L1,L6)
輸出:
#組合型別 import copy d={'a':'apple','b':{'g':'grape','o':'orange'}} print('d:---',d,'\n') dict1=copy.deepcopy(d)#深拷貝 dict2=copy.copy(d)#淺拷貝 dict1['b']['g']='banana' print('dict1:',dict1) print('d:---',d,'\n') dict2['b']['g']='banana' print('dict2:',dict2) print('d:---',d,'\n')
輸出:
字典dict1深拷貝字典d中的資料,即使dict1資料改變,也不會影響d。
字典dict2淺拷貝字典d中的資料,若字典dict2資料發生增添刪改等操作,字典d中的資料也會發生改變。