1. 程式人生 > >python中的複製與拷貝

python中的複製與拷貝

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中的資料也會發生改變。