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的記憶體位址不...