在理解深淺拷貝之前,我們先熟悉下變數物件和資料型別
1.變數和物件
變數-引用-物件(可變物件,不可變物件)
在python中一切都是物件,比如[1,2],'hello world',123,,
比如說:
>>> a = 3
專業表述如下:
變數是乙個系統表的元素,擁有指向物件的連線的空間
物件是被分配的一塊記憶體,儲存其所代表的值
引用是自動形成的從變數到物件的指標
特別注意:型別屬於物件,不是變數
共享引用: 比如說:
>>> a = 3
>>> b = a
在執行賦值語句b = a之後,變數a和變數b指向了同乙個物件的記憶體空間.
2.資料型別
在python中資料型別包括:int,bool,float,str,dict,tuble,set,list等等,
首先,我們需要知道在python中哪些是可變資料型別,哪些是不可變資料型別。可變資料型別:列表list和字典dict;不可變資料型別:整型int、浮點型float、字串型string和元組tuple。
3.對於數字和字串來說,無論通過賦值,淺拷貝還是深拷貝,同乙個值永遠用的是同乙個記憶體位址。
importcopy
a = "
i love python
"b =a
a1 =copy.copy(a)
a2 =copy.deepcopy(b)
(id(a))
(id(b))
(id(a1))
(id(a2))
#輸出:
4.對於字典,列表等可變物件:
例1,關於賦值,只是建立乙個變數,該變數仍指向原來記憶體位址;
#賦值d =
d2 =d
(id(d))
(id(d2))
#輸出:
例2,淺拷貝,
#例3:深拷貝,在記憶體中將所有的資料重新建立乙份,值的存放位置不變。淺拷貝d =
d2 = copy.copy(d) #
淺拷貝,額外建立第一層(變數名id改變,物件id不變,還是引用舊物件)
(id(d))
(id(d2))
print(id(d["k1"
]))print(id(d2["k1"
]))#
輸出;1993456403784
1993456836488
1993456800856
1993456800856
d =d2 =copy.deepcopy(d)
(id(d))
(id(d2))
print(id(d["k3"
]))print(id(d2["k3"
]))print(id(d["k3"
][0]))
print(id(d2["k3"
][0]))
#輸出:
5.應用:
#淺拷貝,改變新字典,久字典也一起改變
dict =
new_dict =copy.copy(dict)
new_dict[
"cpu
"][0] = 90
(new_dict)
(dict)
#輸出:
#參考:深拷貝,改變新字典,久字典沒變
dict =
new_dict =copy.deepcopy(dict)
new_dict[
"cpu
"][0] = 90
(new_dict)
(dict)
#輸出:
JS學習筆記 深淺拷貝
let a let b object.assign a a.age 2 console.log b.age 12 展開運算子.let a let b a.age 2 console.log b.age 1淺拷貝只解決了第一層的問題,如果接下去的值中還有物件的話,兩者享有相同的位址,改變某一物件的值還...
python中深淺拷貝學習
好記性不如爛筆頭。對於常數的拷貝,類似於數值的位址是一定,當進行賦值時,先共用乙個記憶體,如果一方修改了內容,則該方的位址改變,從而使得兩個變數不再相同,即一方修改另一方不會修改。a 2 b a print a b format a,b result a 2,b 2 print id a id b ...
python 深淺拷貝案例 python 深淺拷貝
深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...