Python 淺拷貝與深拷貝,copy模組
阿新 • • 發佈:2018-12-07
python中的任何變數都是物件(引用型別)。
python中的變數分為可變型別和不可變型別。(淺拷貝和深拷貝都是拷貝可變型別內容,不可變型別不會拷貝)
注意:因為元組是不可變型別,所以元組的淺拷貝並不會拷貝任何內容,而是直接引用源元組(和=賦值等同)。
如果元組中的元素都是不可變型別,那麼元組的深拷貝也並不會拷貝任何內容,而是直接引用源元組;但是如果元組中的元素有可變型別,那麼深拷貝才會真正的去深拷貝元組以及元組中的可變元素。
列表、字典的切片([0,1,2][:])和淺拷貝相同。字典的copy()函式也是淺拷貝。
注意:因為不可變型別的變數不會改變,所以不會拷貝任何不可變型別的變數,都是直接引用不可變型別。
demo.py(淺拷貝與深拷貝):
import copy # 匯入copy模組 a = [11,22]; b = [33,44]; list_1 = [a,b]; list_2 = list_1; # 賦值語句。 不會拷貝,只會將list_1的引用給變數list_2 list_3 = copy.copy(list_1); # 淺拷貝。 只會拷貝最頂層(列表),列表中的元素不會拷貝。 list_4 = copy.deepcopy(list_1); # 深拷貝。 除了拷貝列表外,列表中的所有可變元素也會拷貝一份。 print(id(list_1)) # 140338425038856 print(id(list_2)) # 140338425038856 賦值語句不會拷貝,和list_1引用一樣 print(id(list_3)) # 140338449044936 淺拷貝,只拷貝列表,列表中的元素不拷貝 print(id(list_4)) # 140338425040008 深拷貝,拷貝列表,列表中的可變元素也會拷貝 print(id(list_1[0])) # 140338425039944 print(id(list_3[0])) # 140338425039944 淺拷貝,列表中元素的引用與源引用一樣 print(id(list_4[0])) # 140338425039432 深拷貝,列表中可變元素的引用與源引用不一樣 # list_1 = "xxxx" # 修改list_1變數不會影響list_2,list_3和list_4 # list_1.append("xx") # 修改源列表會影響list_2,不會影響list_3和list_4 # list_1[0].append("xxx") # 修改源列表中的可變元素會影響list_2,list_3;但不會影響list_4 print(list_1) print(list_2) print(list_3) print(list_4)