數字和字符串
數字和字符串中的內存都指向同一個地址,所以深拷貝和淺拷貝對於他們而言都是無意義的
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]))
淺拷深拷貝深拷貝貝淺拷貝
---恢復內容結束---