賦值:
賦值就是乙個變數引用乙個變數的值。這兩個變數共用乙個記憶體位址。
當使用可變資料結構時(如 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...