Python學習之淺拷貝與深拷貝
阿新 • • 發佈:2018-12-18
1. 淺拷貝
淺拷貝只複製父物件,其內部的子物件不復制。可通過copy.copy實現。
2. 深拷貝
深拷貝不僅複製父物件,還複製子物件,相當於重新生成了一個一模一樣的物件。
3. 區別
import copy a = [1, 2, 3] b = a c = copy.copy(a) d = copy.deepcopy(a) e = list(a) print("a address: ", id(a)) print("b address: ", id(b)) print("c address: ", id(c)) print("d address: ", id(d)) print("e address: ", id(e))
結果:
我們可以看到b的地址和a一樣,這是因為b僅僅是a的引用的原因
c,d,e分別對應淺拷貝,深拷貝,淺拷貝
再看另一個例子:
import copy
a = [1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)
a.append(4)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)
結果:
在這裡我們可以看到,a變,b跟著變了,而深拷貝和淺拷貝都沒有發生變化,這是因為數字是不可變型別。
常見的不可變型別有:
- 數字
- 字串
- 元組
第三個例子:
import copy
a = [[1, 2], 1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)
a[0].append(3)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)
結果:
這裡我們可以看到僅深拷貝沒有發生變化,這是因為深拷貝不僅拷貝了父物件即列表a,還拷貝了子物件即a中的[1, 2]。列表是可變物件,所以淺拷貝都隨著a的變化而變化了。
可變型別:
- 列表
- 字典
順便說一下可變與不可變型別:
可變型別不論值相不相同地址都不同。
不可變物件值相同則地址相同。
參考: