python深淺拷貝原理

1、對於數字和字符串來講,不管經過賦值,淺拷貝仍是深拷貝,同一個值永遠用的是同一個內存地址,
不會重複在內存中開闢空間。(以下圖,簡要分析)

 1 #對於數字和字符串來講,不管經過賦值,淺拷貝仍是深拷貝,同一個值永遠用的是同一個內存地址
 2 import copy
 3 a1 = 123123
 4 b1 = 123123
 5 print(id(a1))
 6 print(id(b1))   #賦值相同的兩個變量,內存地址同樣
 7 a2 = a1         #賦值,內存地址同樣
 8 print(id(a2))
 9 a3 = copy.copy(a1)
10 print(id(a3))   #淺拷貝,內存地址也同樣
11 a4 = copy.deepcopy(a1)
12 print(id(a4))   #深拷貝,內存地址同樣
13 
14 #輸出結果:
15 4985344
16 4985344
17 4985344
18 4985344
19 4985344
2、對於元組、列表、字典等來講

賦值,只是建立一個變量,該變量指向原來內存地址;spa

1 #賦值
2 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
3 n2 = n1         #賦值,內存ID是同樣的
4 print(id(n1))
5 print(id(n2))
6 
7 #執行結果:
8 8430056
9 8430056

淺拷貝,在內存中只額外建立第一層數據,值的存放位置不變;code

#淺拷貝
import copy
n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
n3 = copy.copy(n1)   #淺拷貝,額外建立第一層(內存ID改變,指向值不變)
print(id(n1))
print(id(n3))
print(id(n1["k3"]))    #值指向內存地址是同樣的
print(id(n3["k3"]))

#執行結果:
5022184
5549032
6362456
6362456

深拷貝,在內存中將全部的數據從新建立一份,值的存放位置不變。blog


 1 #深拷貝
 2 import copy
 3 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
 4 n4 = copy.deepcopy(n1)    #深拷貝,全部從新建立一份(內存ID改變)
 5 print(id(n1))
 6 print(id(n4))
 7 
 8 #執行結果:
 9 6791656
10 6791896
應用:
 1 #應用,淺拷貝,改變新文件,舊文件跟着改變
 2 import copy
 3 dic = {
 4     "cpu":[80,],
 5     "mem":[80,],
 6     "disk":[80,]
 7 }
 8 print("before",dic)
 9 new_dic = copy.copy(dic)   #淺拷貝後,改變新文件,連帶舊文件一塊兒改變了
10 new_dic["cpu"][0] = 50
11 print(dic)
12 print(new_dic)
13 
14 #執行結果:
15 before {'mem': [80], 'disk': [80], 'cpu': [80]}
16 {'mem': [80], 'disk': [80], 'cpu': [50]}
17 {'mem': [80], 'disk': [80], 'cpu': [50]}
 1 #應用,深拷貝,改變新文件,舊文件不會改變
 2 import copy
 3 dic = {
 4     "cpu":[80,],
 5     "mem":[80,],
 6     "disk":[80,]
 7 }
 8 print("before",dic)
 9 new_dic = copy.deepcopy(dic)   #深拷貝後,改變新文件,舊文件不會改變
10 new_dic["cpu"][0] = 50
11 print(dic)
12 print(new_dic)
13 
14 #執行結果:
15 before {'mem': [80], 'disk': [80], 'cpu': [80]}
16 {'mem': [80], 'disk': [80], 'cpu': [80]}
17 {'mem': [80], 'disk': [80], 'cpu': [50]}

 

 

 

 

 
相關文章
相關標籤/搜索