1. 程式人生 > 實用技巧 >簡述python中的深淺拷貝

簡述python中的深淺拷貝

說到什麼是深淺拷貝,就不得不說python中賦值的含義,賦值並不是拷貝,而是將target和object建立了一種聯絡,當一個object可變時,連線該object的任意一個target改變該object值都會影響其他連線該object的target的取值。如:

>>> a=[1,2,3]
>>> b=a
>>> b[0]=0  
>>> b
[0, 2, 3]
>>> a
[0, 2, 3]

那如果只想改變一個mutable object的值,而它原來的值還保留,該怎麼辦呢?答案就是拷貝,通過python 內建庫copy。

而拷貝又分為深拷貝(copy.deepcopy)和淺拷貝(copy.copy),深淺拷貝的區別在於對“複合物件”(即該物件還包含了其他物件,如list,dict等)時拷貝的不同:

對於淺拷貝,新建一個“複合物件”,該物件包含的是被拷貝物件的reference;

對於深拷貝,新建一個“複合物件”,儘量的把被拷貝物件中含有的物件全都深拷貝;

如:

-------------------------shallow copy-------------------
>>> a=[1,2,3]
>>> c=a.copy()
>>> c
[0, 2, 3]
>>> c[0]=4
>>> c
[4, 2, 3]
>>> a
[0, 2, 3]

>>> d=[[0,1],2,3]
>>> e=d.copy()
>>> e[0][0]=100
>>> e
[[100, 1], 2, 3]
>>> d
[[100, 1], 2, 3]

----------------------deep copy--------------------------
>>> import copy
>>> f=copy.deepcopy(d)
>>> d
[[100, 1], 2, 3]
>>> f
[[100, 1], 2, 3]
>>> f[0][0]=5
>>> f
[[5, 1], 2, 3]
>>> d
[[100, 1], 2, 3]


>>> g=[[[1],2]]
>>> h=copy.deepcopy(g)
>>> h[0][0][0]=100
>>> h
[[[100], 2]]
>>> g
[[[1], 2]]

 當然,對於list,dict自身的copy方法都是shallow copy