python深淺拷貝
一、引言
在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把他賦值給另外乙個變數的時候,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。
針對列表l1=['a','b','c',['d','e','f']]一般有三種方法,分別為:拷貝(賦值)、淺拷貝、深拷貝。
注意:拷貝、淺拷貝、深拷貝都是針對可變型別資料而言的
1.1 可變 or 不可變
id 不變值可變,即在原理的基礎上修改,則為可變資料型別;值變id也變,即從新申請乙個空間放入新值,則為不可變的資料型別。
age = 19
print('first:',id(age))
age = 20
print('second:',id(age))
#輸出:
first: 140731004973888
second: 140731004973920
x = 10
y = 20
print('x:', id(x), 'y', id(y))
x, y = y, x
print('x:', id(x), 'y', id(y))
#輸出:
x: 140731004973600 y 140731004973920
x: 140731004973920 y 140731004973600
二、拷貝
如果l2是l1的拷貝物件,則l1內部的任何資料型別的元素變化,則l2內部的元素也會跟著變化,因為可變型別值變id不變。
l1 = ['a','b','c',['d','e','f']]
l2 = l1
print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
#輸出 :
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
三、淺拷貝
如果l2是l1的淺拷貝物件,則l1內的不可變元素發生了改變,l2不變。如果l1內的可變元素發生l改變,則l2會跟著改變。
import copy
l1 = ['a','b','c',['d','e','f']]
l2 = copy.copy(l1)
print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]
print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g']]
四、深拷貝
如果l2 是l1 的深拷貝物件,則l1內的不可變元素發生了改變,l2不變。
如果l1內的可變元素發生了改變,l2也不會改變,即l2 是永遠不會因為l1 的變化而變化的。
import copy
l1 = ['a','b','c',['d','e','f']]
l2 = copy.deepcopy(l1)
print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]
print(l1)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
#輸出:
['a', 'b', 'c', ['d', 'e', 'f']]
總結牢記: 拷貝/淺拷貝/深拷貝 只針對可變資料型別
拷貝: 當lt2為lt的拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2變化,拷貝就是簡單的賦值
淺拷貝:當lt2為lt的淺拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2不變化,實現用copy.copy() 可變資料的型別中的內建方法.copy()
深拷貝: 當lt2為lt的深拷貝物件時,lt內的可變型別變化,lt2不變化;lt內的不可變型別變化,lt2不變
笨方法學python
書結構非常簡單,其實就是 52 個習題而已。其中 26 個覆蓋了輸入輸出 變數 以及函式三個課題,另外 26 個覆蓋了一些比較高階的話題,如條件判斷 迴圈 類和物件 測試 以及專案的實現等。每一章節的格式基本都是一樣的,以 練習題開始,讀者照著說明 編寫 不允許複製貼上 執行並檢查結果,然後再做一下...
笨方法學python 一
print i like typing this print this is fun print i said do not touch this.如果用同種引號會報錯 file ex1.py line 8 print i said do not touch this.syntaxerror inv...
學習筆記 笨方法學python
1.1 列表和字典 列表是有一組任意型別的值構成的有序列表,他由方括號構造而成 number list 1,2,3,4 mylist 1,a b 2,4 字典是由一組明值對構成的無序集合,由大括號構造而成 ages 可以通過以下方式訪問列表和字典中的元素 mylist 2 return a ages...