1. 程式人生 > >Python學習之淺拷貝與深拷貝

Python學習之淺拷貝與深拷貝

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的變化而變化了。

可變型別:
- 列表
- 字典

順便說一下可變與不可變型別:

可變型別不論值相不相同地址都不同。

不可變物件值相同則地址相同。

參考: