Python——深拷貝和淺拷貝


深拷貝、淺拷貝

1. 淺拷貝

淺拷貝是對於一個對象的頂層拷貝

import copy

a = [[1, 2], 3]
b = copy.copy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1]))

a[0].append(1)
print(a)
print(b)

輸出結果:

2249583452872
2250135748552
2249583452808
2249583452808
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

 

copy()是淺拷貝,只拷貝了最頂層的數組,而數組中的內容只是拷貝了引用。

因此用a[0].append(1)方法后,數組a和b都發生了改變。

 

2. 深拷貝

深拷貝是對於一個對象所有層次的拷貝(遞歸)

import copy

a = [[1, 2], 3]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))

a[0].append(1)
print(a)
print(b)

 

輸出結果:

1931836547784
1932360400776
1931836547720
1931837818120
[[1, 2, 1], 3]
[[1, 2], 3]

 

deepcopy()是深拷貝,不僅拷貝最頂層的數組,數組里的內容也拷貝了,這里不同於拷貝引用,而是創建了新的地址空間,存放的內容和原數組相同。因此這次用a[0].append(1)后,b數組沒有發生變化。

3.拷貝的其他方式

分片拷貝淺拷貝

import copy

a = [[1, 2], 3]
b = a[:]
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1]))

a[0].append(1)
print(a)
print(b)

 

輸出結果:

2672287769288
2672811617864
2672287769224
2672287769224
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

  

可見:分片拷貝是淺拷貝。

字典的copy()方法

d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying'])

c = d.copy()

print(d)
print(c)

print(id(d))
print(id(c))

print(id(d['name']))
print(id(c['name']))

print(id(d['friend']))
print(id(c['friend']))

d['friend'].append('lisa')

print(d)
print(c)

  

結果:

{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
2175018372336
2175021103360
2175021498672
2175021498672
2175017902728
2175017902728
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}

  

可見,字典的copy()方法也是淺拷貝。

4.注意

copy()和deepcopy()對於不包含可變類型數據的元組,只會拷貝引用

import copy

d = (1, 2, 3)

c = copy.copy(d)
b = copy.deepcopy(d)

print(id(d))
print(id(c))
print(id(b))

結果:

1959295969464
1959295969464
1959295969464

當deepcopy()對於包含可變類型數據的元組時,才會拷貝整個元組的內容

import copy

d = (1, 2, [1,2,3])

c = copy.copy(d)
b = copy.deepcopy(d)

print(id(d))
print(id(c))
print(id(b))

  

結果:

2774011472056
2774011472056
2774011384024

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM