首页 > 代码库 > python的深拷贝和浅拷贝

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

 技术分享

 

 

 浅拷深拷贝深拷贝贝浅拷贝

 

---恢复内容结束---

python的深拷贝和浅拷贝