python中的深淺拷貝與賦值。

2021-09-22 13:03:26 字數 2934 閱讀 6216

賦值:

賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。									

當使用可變資料結構時(如 list, dict, set),其中乙個變數的值改變,會使另乙個變數的值也發生改變,但記憶體位址不改變。

a =[1

,2,3

]b = ab[1

]=4print(id

(a), a,

id(b)

, b)

#1992269718152 [1, 4, 3] 1992269718152 [1, 4, 3]

# a, b兩個變數共用一塊記憶體位址,當其中乙個變數的值改變時,會使記憶體位址中儲存的值發生改變,所以兩個變數的值都會發生改變,記憶體位址不發生變化。

a =b = ab[1

]=5print(id

(a), a,

id(b)

, b)

# 2878324414216 2878324414216

在變數使用不可變資料時(如str, int,bool,元組),當你改變變數的值時,記憶體會重新開闢一塊記憶體儲存改變的值,所以變兩個量不會一起改變,但是值發生變化的變數,記憶體會發生變化。

當值不發生改變時, 兩個變數的記憶體位址是一樣的。

a =

1b = a

a =4

print(id

(a), a,

id(b)

, b)

# 140728118239984 4 140728118239888 1

a ='abc'

b = a

a ='b'

print(id

(a), a,

id(b)

, b)

# 1217126454304 b 1217126541384 abc

a =(1,

2,3)

b = a

a =(4,

5,6)

print(id

(a), a,

id(b)

, b)

# 2786397815864 (4, 5, 6) 2786397816872 (1, 2, 3)

拷貝

當使用的是不可變資料,變數的值沒有被改變時,兩個變數的記憶體位址是相同的。
import copy

a =1

b = copy.copy(a)

print(id

(a), a,

id(b)

, b)

# 140728118239888 1 140728118239888 1

當使用的是可變資料時,b變數會將a變數的值拷貝乙份,同時開闢一塊新的記憶體位址儲存所拷貝的值。
import copy

a =[1,

2,3]

b = copy.copy(a)

print(id

(a), a,

id(b)

, b)

# 2332683297416 [1, 2, 3] 2332683297480 [1, 2, 3]

如果改變列表a中元素的值,會發現b變數並不會隨著a變數元素的改變而改變。
。import copy

a =[1,

2,3]

b = copy.copy(a)a[0

]=2print(id

(a), a,

id(b)

, b)

# 2843040768648 [2, 2, 3] 2843040768712 [1, 2, 3]

淺拷貝:

淺拷貝,顧名思義,淺淺的拷貝。在面對可變資料型別時,淺拷貝只拷貝第一層的資料。

如果在a列表中在巢狀乙個列表,會發現兩個巢狀列表的記憶體位址是相同的。

同時改變a巢狀列表中元素的值時,b列表中巢狀列表的值也會發生改變。

這是因為淺拷貝只能拷貝可變資料的第一層,第二層是不會拷貝的。

import copy

a =[1,

[2,3

],3]

b = copy.copy(a)a[0

]=2a[

1][0

]=1print(id

(a), a,

id(b)

, b)

# 2583273104072 [2, [1, 3], 3] 2581515309384 [1, [1, 3], 3]

print(id

(a[1])

, a[1]

,id(b[1])

, b[1]

)# 2295949451912 [1, 3] 2295949451912 [1, 3]

深拷貝:

深拷貝會拷貝所有的可變資料。不論是第一層還是第二層,都會進行拷貝。

在a列表中巢狀列表,改變a巢狀列表元素的值時,b列表的巢狀列表元素並不會發生改變。

a,b列表的巢狀列表的記憶體位址也不相同。

a = [1, [2, 3], 3]

b = copy.deepcopy(a)

a[0] = 2

a[1][0] = 1

print(id(a), a, id(b), b) # 2772121445064 [2, [1, 3], 3] 2770363519368 [1, [2, 3], 3]

print(id(a[1]), a[1], id(b[1]), b[1]) # 2772121445000 [1, 3] 2772122726664 [2, 3]

python中的賦值與深淺拷貝

在python中,只有在int和字串,元組等不可變型別中,與深淺拷貝的結果一樣 因為其是不可變型別,都是連記憶體位址一起 複製 了。而在list,dict,set中,深淺拷貝並沒有複製 位址 複製 記憶體位址的結果就是,之後的操作會影響原來的物件。以下所有的內容都是基於記憶體位址來說的。1.int型...

Python中的賦值與深淺拷貝

鑑於對很多初學程式設計的小夥伴來說,對於賦值和深淺拷貝的用法有些疑問,所以我就結合python變數儲存的特性從記憶體的角度來談一談賦值和深淺拷貝 一些基本的定義 幾個術語的解釋 深淺拷貝的作用 對於不可變物件的深淺拷貝 不可變物件型別 這個不可變物件型別裡面不能包含可變物件型別,如元祖裡面包含列表就...

python中的賦值與深淺拷貝

python當中對於拷貝,分為兩種型別。一種是數字和字串,另一種就是列表 元組 字典等其他型別了。舉個栗子 a1 123123 a2 123123 a2 a1 賦值 print id a1 通過id 函式來列印變數在記憶體當中的位址 print id a2 輸出結果是 1959780298352 1...