python浅谈,赋值深浅拷贝

浅拷贝和赋值两者的意义相差不大,都是creat一个变量,变量的指向原数据的内存地址,而深拷贝则是开辟出一个新的地址,把整个数据从新获取过去,变成自己的

import  copy
#浅拷贝、深拷贝区别:
#实例一:
dic = {'k1':'v1','k2':'123456','k3':[1,2,3,4,5,6,],'k4':{'c1':'p1','c2':'123456'}}
new1_dic = copy.copy(dic)   #浅拷贝
new2_dic = copy.deepcopy(dic)   #深拷贝
print(id(dic['k3']))
print(id(new1_dic['k3']))
print(id(dic['k4']))
print(id(new1_dic['k4']))

#深拷贝所显示出来的id不一样
print(16*'*')
print(id(dic['k3']))
print(id(new2_dic['k3']))
print(id(dic['k4']))
print(id(new2_dic['k4']))

#结果:
1685162545584
1685162545584
****************
1685196451208
1685196451400
1685162545584
1685196466792

我们可以从结果中看到,浅拷贝这个变量id是指向原数据的,并没有开辟出新的空间用来存放

而深拷贝则是开辟了新地址用于存放,所以这就造成了实例二这样的情况:


#实例二:
print("example two!!!")
new3_dic = copy.copy(dic)       #浅拷贝
new3_dic['k3'][0] = 'change'
print(dic)
print(new3_dic)     #可以看到,用new3_dic浅拷贝之后修改里面的数据,会把原dic的数据也修改了(ps:浅拷贝没有开辟新的空间,还是指向原obj内存

#如果要保留元数据,获得新的数据并修改,则采用深拷贝:
print(16*'#')
new4_dic = copy.deepcopy(dic)#浅拷贝
new4_dic['k3'][0] = 'new_change'
print(dic)
print(new4_dic)

#结果:
example two!!!
{'k1': 'v1', 'k2': '123456', 'k3': ['change', 2, 3, 4, 5, 6], 'k4': {'c1': 'p1', 'c2': '123456'}}
{'k1': 'v1', 'k2': '123456', 'k3': ['change', 2, 3, 4, 5, 6], 'k4': {'c1': 'p1', 'c2': '123456'}}
################
{'k1': 'v1', 'k2': '123456', 'k3': ['change', 2, 3, 4, 5, 6], 'k4': {'c1': 'p1', 'c2': '123456'}}
{'k1': 'v1', 'k2': '123456', 'k3': ['new_change', 2, 3, 4, 5, 6], 'k4': {'c1': 'p1', 'c2': '123456'}}
我们可以看到,浅拷贝之后,对拷贝的变量进行赋值,会把元数据也修改了,

但是深拷贝因为开辟了新的空间存放数据,所以赋值修改的还是变量自己,并不会印象到原数据


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值