1. 程式人生 > >Python 淺拷貝與深拷貝,copy模組

Python 淺拷貝與深拷貝,copy模組

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)