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

2021-09-02 06:31:14 字數 1288 閱讀 3147

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 = "***x" # 修改list_1變數不會影響list_2,list_3和list_4

print(list_1)

print(list_2)

print(list_3)

print(list_4)

Python 淺拷貝與深拷貝

淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...

Python 淺拷貝與深拷貝

以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....

python 深拷貝與淺拷貝

當乙個變數 的時候,約定為 指向位址的過程 如果copy.copy 拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向 因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的 時候它會自動判斷,是指向。如果,用copy.copy copy.deepcopy 對乙個全部是不可變型...