python學習筆記 深淺拷貝的使用和原理

2022-03-21 18:34:40 字數 2929 閱讀 9518

在理解深淺拷貝之前,我們先熟悉下變數物件和資料型別

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.對於數字和字串來說,無論通過賦值,淺拷貝還是深拷貝,同乙個值永遠用的是同乙個記憶體位址。

import

copy

a = "

i love python

"b =a

a1 =copy.copy(a)

a2 =copy.deepcopy(b)

print

(id(a))

print

(id(b))

print

(id(a1))

print

(id(a2))

#輸出:

4.對於字典,列表等可變物件:

例1,關於賦值,只是建立乙個變數,該變數仍指向原來記憶體位址;

#

賦值d =

d2 =d

print

(id(d))

print

(id(d2))

#輸出:

例2,淺拷貝,

#

淺拷貝d =

d2 = copy.copy(d) #

淺拷貝,額外建立第一層(變數名id改變,物件id不變,還是引用舊物件)

print

(id(d))

print

(id(d2))

print(id(d["k1"

]))print(id(d2["k1"

]))#

輸出;1993456403784

1993456836488

1993456800856

1993456800856

例3:深拷貝,在記憶體中將所有的資料重新建立乙份,值的存放位置不變。

d = 

d2 =copy.deepcopy(d)

print

(id(d))

print

(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

print

(new_dict)

print

(dict)

#輸出:

#

深拷貝,改變新字典,久字典沒變

dict =

new_dict =copy.deepcopy(dict)

new_dict[

"cpu

"][0] = 90

print

(new_dict)

print

(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 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...