Python基礎學習13-淺拷貝和深拷貝

亞寶一枝花發表於2020-11-20

淺拷貝

對於某個物件,如何建立它的拷貝呢?也就是說,如何建立與該物件具有相同值的另一個物件呢?

所謂淺拷貝是指,對於某個物件,雖然建立了與該物件具有相同值的另一個物件,但是,這兩個物件內部巢狀的對應的子物件全都是同一個物件。簡單的說,外部進行了拷貝,內部沒有拷貝。

以下方式得到的拷貝都是淺拷貝:

  1. 切片操作 [:]
  2. 呼叫列表、字典、結合的方法 copy()
  3. 呼叫內建函式 list() 、dict()、set()
  4. 呼叫標準庫模組 copy 中的函式 copy()
L1 = [[3, 6], 8]
L2 = L1[:]
L2 = L1.copy()
L2 = list(L1)
import copy
L2 = copy.copy(L1)  # 呼叫標準庫模組 copy 中的函式 copy
print(L2)       # [[3, 6], 8]

print('id(L1):%s' % id(L1))     # id(L1):2484307186696
print('id(L2):%s' % id(L2))     # id(L2):2484596315592

print('id(L1[0]):%s' % id(L1[0]))       # id(L1[0]):2326147256840
print('id(L2[0]):%s' % id(L2[0]))       # id(L1[0]):2326147256840

print('id(L1[1]):%s' % id(L1[1]))       # id(L1[1]):140733955146224
print('id(L2[1]):%s' % id(L2[1]))       # id(L2[1]):140733955146224


L1[0][1] = 7
L1[1] = 9
print(L1)       # [[3, 7], 9]
print(L2)       # [[3, 7], 8]


# 對於沒有巢狀子物件的不可變物件,例如:整數物件,字串物件和元組物件等,不會進行拷貝,也就是說,不會建立另一個物件
i = 18
ic1 = int(18)
print(ic1)      # 18

print('id(i):%s' % id(i))           # id(i):140733955146544
print('id(ic1):%s' % id(ic1))       # id(ic1):140733955146544

ic2 = copy.copy(i)
print(ic2)      # 18

print('id(i):%s' % id(i))           # id(i):140733947020080
print('id(ic1):%s' % id(ic1))       # id(ic1):140733947020080


t = (1, 2, 3)

tc1 = tuple(t)
print(tc1)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1951394906264
print('id(tc1):%s' % id(tc1))       # id(t):1951394906264

tc2 = copy.copy(t)
print(tc2)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1980822143128
print('id(tc2):%s' % id(tc2))       # id(tc2):1980822143128

 

深拷貝

所謂深拷貝,指的是:對於某個物件,建立與該物件具有相同值的另一個物件,同時,這兩個物件內部巢狀的對應可變子物件,全都不是同一個物件。簡單的說,外部和內部都進行了拷貝。

如果不可變物件,內部有巢狀的可變的子物件,在深拷貝後會建立一個與該不可變物件具有相同值的另一個物件

import copy

# 對於沒有巢狀子物件的不可變物件,例如:整數物件,字串物件和元組物件等,不會進行拷貝,也就是說,不會建立另一個物件
i = 18

ic = copy.deepcopy(i)
print(ic)      # 18

print('id(i):%s' % id(i))           # id(i):140734429037360
print('id(ic):%s' % id(ic))       # id(ic):140734429037360


t = (1, 2, 3)

tc = copy.deepcopy(t)
print(tc)      # (1, 2, 3)

print('id(t):%s' % id(t))           # id(t):1492343996568
print('id(tc):%s' % id(tc))       # id(tc):1492343996568


L1 = [[3, 6], 8]

L2 = copy.deepcopy(L1)
print(L2)           # [[3, 6], 8]
print('id(L1):%s' % id(L1))     # id(L1):1744899232776
print('id(L2):%s' % id(L2))     # id(L2):1745186688264

print('id(L1[0]):%s' % id(L1[0]))       # id(L1[0]):1744899232264
print('id(L2[0]):%s' % id(L2[0]))       # id(L2[0]):1744900612488

print('id(L1[1]):%s' % id(L1[1]))       # id(L1[1]):140734429037040
print('id(L2[1]):%s' % id(L2[1]))       # id(L2[1]):140734429037040

L1[0][1] = 7
L1[1] = 9
print(L1)       # [[3, 7], 9]
print(L2)       # [[3, 6], 8]


t1 = ([3, 6], 8)

t2 = copy.deepcopy(t1)
print(t2)           # ([3, 6], 8)
print('id(t1):%s' % id(t1))     # id(t1):3119702275208
print('id(t2):%s' % id(t2))     # id(t2):3119702236424

print('id(t1[0]):%s' % id(t1[0]))       # id(t1[0]):3119702526728
print('id(t2[0]):%s' % id(t2[0]))       # id(t2[0]):3119702415176

print('id(t1[1]):%s' % id(t1[1]))       # id(t1[1]):140734429037040
print('id(t2[1]):%s' % id(t2[1]))       # id(t2[1]):140734429037040

 

相關文章