在python中,只有在int和字串,元組等不可變型別中,=與深淺拷貝的結果一樣 ,因為其是不可變型別,都是連記憶體位址一起『複製』了。而在list,dict,set中,深淺拷貝並沒有複製『位址』。『複製』記憶體位址的結果就是,之後的操作會影響原來的物件。
以下所有的內容都是基於記憶體位址來說的。
1.int型
>>> import copy
>>> a=1
>>> b=a #賦值
>>> c=copy.copy(a) #淺拷貝
>>> d=copy.deepcopy(a)#深拷貝
>>> print(id(a))
1473881184
>>> print(id(b))
1473881184
>>> print(id(c))
1473881184
>>> print(id(d))
1473881184 #id位址都相等,所以深淺拷貝和賦值一樣
既然記憶體位址也複製的話,那就應該「牽一髮而動全身」。讓我們來試驗下。
>>> a=1
>>> b=a
>>> b=b+1
>>> b
2>>> a
1
很奇怪,為什麼這裡複製了『位址』,怎麼結果還不一樣呢?答案在這裡。
>>> a=1
>>> b=a
>>> id(b)
1473881184
>>> b=b+1
>>> id(b)
1473881216
這是因為第二次b=b+1的時又給他分配了新的位址,字串也一樣。只有不可變型別例外,對其他的物件操作時,可以直接在分配好的記憶體位址上操作,而不會分配新的位址空間。
2.字串
>>> a='hello'
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> print(id(a))
2723341052984
>>> print(id(b))
2723341052984
>>> print(id(c))
2723341052984
>>> print(id(d))
2723341052984 #結果與int一樣,三者相同
3.列表 (賦值是完全『複製』,而深淺拷貝只是複製的值)
>>> a=[1,2,3]
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> print(id(a))
2723341059336
>>> print(id(b))
2723341059336 #賦值把記憶體位址一起『複製』了
>>> print(id(c))
2723341059848 #記憶體位址與a不同
>>> print(id(d))
2723341059592 #記憶體位址與a不同
>>> print(a is b)
true
讓我們來檢驗下『牽一髮而動全身』的效果
賦值複製了記憶體位址,所以二者相同
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3, 1]
>>> a
[1, 2, 3, 1]
淺拷貝沒有複製『記憶體位址』,所以a不會變
>>> a=[1,2,3]
>>> c=copy.copy(a)
>>> c
[1, 2, 3, 1]
>>> a
[1, 2, 3]
深拷貝同上
>>> a=[1,2,3]
>>> d=copy.deepcopy(a)
>>> a
[1, 2, 3]
>>> d
[1, 2, 3, 1]
4.字典(與列表一樣,只有賦值是完全『複製』)
>>> a=
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> print(id(a))
2723338483752
>>> print(id(b))
2723338483752
>>> print(id(c))
2723338483824
>>> print(id(d))
2723341076880
>>> print(a is b)
true
>>> a=
>>> d=copy.deepcopy(a)
>>> d[2]=2
>>> a
>>> d
>>> c=copy.copy(a)
>>> c[3]=3
>>> c
>>> a
5.集合(與列表和字典一樣。只有賦值是完全複製)
>>> a=set([1,2,3])
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> print(id(a))
2723341054472
>>> print(id(b))
2723341054472
>>> print(id(c))
2723341054696
>>> print(id(d))
2723341055144
>>> print(a is b)
true
python中的深淺拷貝與賦值。
賦值 賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。當使用可變資料結構時 如 list,dict,set 其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。a 1 2,3 b ab 1 4print id a a,id b b 1992269718152 1,...
Python中的賦值與深淺拷貝
鑑於對很多初學程式設計的小夥伴來說,對於賦值和深淺拷貝的用法有些疑問,所以我就結合python變數儲存的特性從記憶體的角度來談一談賦值和深淺拷貝 一些基本的定義 幾個術語的解釋 深淺拷貝的作用 對於不可變物件的深淺拷貝 不可變物件型別 這個不可變物件型別裡面不能包含可變物件型別,如元祖裡面包含列表就...
python中的賦值與深淺拷貝
python當中對於拷貝,分為兩種型別。一種是數字和字串,另一種就是列表 元組 字典等其他型別了。舉個栗子 a1 123123 a2 123123 a2 a1 賦值 print id a1 通過id 函式來列印變數在記憶體當中的位址 print id a2 輸出結果是 1959780298352 1...