python的深拷貝和淺拷貝


數字和字符串

數字和字符串中的內存都指向同一個地址,所以深拷貝和淺拷貝對於他們而言都是無意義的

 

import copy

a = 123                #賦值

print(id(a))           #輸出存儲變量的地址

b = a

print(id(b))

b = copy.copy(a)       #淺拷貝

print(id(b))

c = copy.deepcopy(a)  #深拷貝

print(id(c))

 

 淺拷貝

對於字典 元組 和列表來說,進行淺拷貝和深拷貝時,內存的地址是不同的

淺拷貝只會拷貝內存中的第一層數據

import copy

dic = {'key1':123,'key2':[123,456]}            #創建一個字典嵌套列表

print(id(dic['key1']))
print(id(dic['key2']))
print(id(dic['key2'][0]))                      #打印列表中的地址

print("\n")

new_dic = copy.copy(dic)                       #使用淺拷貝賦值 

print("*",id(new_dic['key1']))
print("*",id(new_dic['key2']))
print("*",id(new_dic['key2'][0]))


發現內存中地址的值都是完全相同

 深拷貝

而對於深拷貝來說將會把所有數據重新創建

import copy

dic = {'key1':123,'key2':[123,456]}            #創建一個字典嵌套列表

print(id(dic['key1']))
print(id(dic['key2']))
print(id(dic['key2'][0]))                      #打印列表中的地址

print("\n")

new_dic = copy.deepcopy(dic)                       #使用深拷貝賦值 

print("*",id(new_dic['key1']))
print("*",id(new_dic['key2']))
print("*",id(new_dic['key2'][0]))

 深拷貝的應用

在淺拷貝中 當改變拷貝對象的值 被拷貝對象的值也會隨之改變

import copy

dic = {'key1':123,'key2':[123,456]}            #創建一個字典嵌套列表


print(dic['key2'][0])                          #打印列表中的地址

print("\n")

new_dic = copy.deepcopy(dic)                       #使用淺拷貝賦值 

new_dic['key2'][0] = 789                       #改變字典中列表的值

print(dic['key2'][0])
print((new_dic['key2'][0]))

 

當不想改變被拷貝的值時 應該使用深拷貝

import copy

dic = {'key1':123,'key2':[123,456]}            #創建一個字典嵌套列表


print(dic['key2'][0])                          #打印列表中的地址

print("\n")

new_dic = copy.deepcopy(dic)                       #使用深拷貝賦值 

new_dic['key2'][0] = 789                       #改變字典中列表的值

print(dic['key2'][0])
print((new_dic['key2'][0]))

 

 

 

 淺拷深拷貝深拷貝貝淺拷貝

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM