拷貝實際上其實就是在賦值,好比咱們有一個列表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']]
深拷貝和淺拷貝同樣,在寫代碼以前須要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()