python中的賦值與深淺拷貝

2021-09-23 22:37:47 字數 3062 閱讀 6545

在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...