032 深淺拷貝

一.拷貝

拷貝實際上其實就是在賦值,好比咱們有一個列表L1,定義另外一個列表L2引用列表L1,實際上就是在拷貝列表L1的值,因爲因爲L1列表是可變的數據類型,因此當L1的值變的時候,L2的值也是在跟着變的.那其實就算L1內的是不可變的數據類型,L1的內容變化,L2的內容也同樣會隨之變化的python

# # 拷貝(賦值)
lt = [1, 2, 3]
lt2 = lt

lt.append(4)
print(lt)
# [1, 2, 3, 4]
# 由於列表是可變類型,因此lt的值變化,lt2的值也會跟着變化
print(lt2)
# [1, 2, 3, 4]

二.淺拷貝

淺拷貝時,咱們時須要在寫代碼前import.copy,導入copy的方法,其實列表在內存空間裏是以索引的形式存在的,索引指向的纔是對應的具體的值,那當咱們用L2去copy列表L1的時候,那他們兩個列表的索引只想的值都是同樣的,若是L1的某一索引對應的值有變化的時候,L2這個列表是否變化是取決於L1列表變化的那個索引的值是否爲可變化數據類型。也就是說當L1列表內的數據是可變化類型的化,L2會隨之變化:L1列表內的數據是不可變的數據類型,那L2列表的數據則不會跟着變化。app

# 淺拷貝
# copy.copy()
import copy

l1 = ['xichen','nick','egon',['rockey','pilipili']]
l2 = copy.copy(l1)
l1.append('xuchen')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili'], 'xuchen'] 
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili']]

l1[-1].append('xucheng')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]

3.深拷貝

深拷貝和淺拷貝同樣,在寫代碼以前須要import.copy導入copy的方法,可是咱們深拷貝的時候用的是deepcopy,其餘的語法和淺拷貝是同樣的,可是深拷貝和淺拷貝不同的是,深拷貝無論列表L1裏面的內容是可變仍是不可變的,當L1變化的時候,L2列表裏面的數據都不會改變的code

import copy
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
# id(lt) 2608713900296
# id(lt[0]) 2608710450544
# id(lt[1]) 2608593350352
# id(lt[2]) 2608594909872
# id(lt[3]) 2608713954696
**************************************************

lt2 = copy.deepcopy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)
# id(lt2) 2608713900616
# id(lt2[0]) 2608710450544
# id(lt2[1]) 2608593350352
# id(lt2[2]) 2608594909872
# id(lt2[3]) 2608713900744
**************************************************

總結:對象

牢記: 拷貝/淺拷貝/深拷貝 只針對可變數據類型
拷貝: 當lt2爲lt的拷貝對象時,lt內的可變類型變化,lt2變化;lt內的不可變類型變化,lt2變化簡單的賦值
淺拷貝:當lt2爲lt的淺拷貝對象時,lt內的可變類型變化,lt2變化;lt內的不可變類型變化,lt2不變化copy.copy()   可變數據的類型中的內置方法.copy()
深拷貝: 當lt2爲lt的深拷貝對象時,lt內的可變類型變化,lt2不變化;lt內的不可變類型變化,lt2不變copy.deepcopy()
相關文章
相關標籤/搜索