Python3之淺拷貝和深拷貝

2021-10-07 15:15:06 字數 1902 閱讀 6208

python中賦值語句不複製物件,而是在目標和物件之間建立繫結 (bindings) 關係。python3中有6種標準的資料型別,可分為可變型別和不可變型別。

可變型別:list(列表)、dictionary(字典)、set(集合)。

不可變型別:number(數字)、string(字串)、tuple(元組)。

淺拷貝由copy模組裡面的copy方法實現。淺拷貝後,改變原始物件中可變型別的元素的值,會同時影響拷貝後的物件;改變原始物件中不可變型別的元素的值,不會影響拷貝後的物件。

import copy

#定義乙個列表,其中第乙個元素是可變型別。

list1 = [[1,2], 'fei', 66];

#進行淺copy

list2 = copy.copy(list1);

#物件位址是否相同。

print(id(list1));

print(id(list2));

#結果:不同

46177816

46177936

#第乙個元素位址是否相同。

print(id(list1[0]));

print(id(list2[0]));

#結果:相同

46240432

46240432

#第二個元素位址是否相同。

print(id(list1[1]));

print(id(list2[1]));

#結果:相同

45547328

45547328

#改變第乙個值,檢視複製物件變化。

list1[0][0] = 2;

print(list2);

#結果:複製物件發生變化

[[2, 2], 'fei', 66]

#改變第二個值,檢視複製物件變化。

list1[1] = 'ge';

print(list2);

#結果:複製物件沒發生變了

[[2, 2], 'fei', 66]

copy模組裡面的deepcopy方法實現。

深拷貝,除了頂層拷貝,還對子元素也進行了拷貝。

經過深拷貝後,原始物件和拷貝物件所有的可變元素位址都沒有相同的了。

import copy

#定義乙個列表,其中第乙個元素是可變型別。

list1 = [[1,2], 'fei', 66];

#進行深copy

list2 = copy.copy(list1);

#物件位址是否相同。

print(id(list1));

print(id(list2));

#結果:不同

46177816

46177936

#第乙個元素位址是否相同。

print(id(list1[0]));

print(id(list2[0]));

#結果:不同

49123856

49588784

#第二個元素位址是否相同。

print(id(list1[1]));

print(id(list2[1]));

#結果:相同

45547328

45547328

#改變第乙個值,檢視複製物件變化。

list1[0][0] = 2;

print(list2);

#結果:複製物件沒發生變了

[[1, 2], 'fei', 66]

#改變第二個值,檢視複製物件變化。

list1[1] = 'ge';

print(list2);

#結果:複製物件沒發生變了

[[1, 2], 'fei', 66]

Python3入門之 淺拷貝和深拷貝

由於python使用了物件引用,因此在使用賦值操作符 時,並沒有進行賦值操作。如果右邊的運算元是字面值,比如字串或數字,那麼左邊的運算元被設定為乙個物件引用,該物件引用將指向存放字面值的記憶體物件。如果右邊的運算元是乙個物件引用,那麼左邊的運算元將設定為乙個物件引用,並與右邊的運算元指向相同的物件。...

Python3的深拷貝和淺拷貝

a 1 b a a 2 print a,b print id a id b 執行結果 2 11445293568 1445293536 列表直接復賦值給列表不屬於拷貝,只是記憶體位址的引用 list1 a b c list2 list1 print list1,list2 print id list...

Python之深拷貝和淺拷貝

賦值,深拷貝和淺拷貝的區別?python中如何拷貝乙個物件?直接賦值 li1 li 只傳遞物件的引用,li1指向物件li的記憶體位址空間,因此,原有列表li改變,被賦值的li1也會做相應的改變.深拷貝 import copy,eg li3 copy.deepcopy li li和li3的記憶體位址不...