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]}