python浅复制与深复制

copy,复制其包含的所有值,当然只管第一层。
浅复制
>>> a = 'abc'
>>> b = a
>>> id(a),id(b)                       内存的位置
(140476358384784, 140476358384784)     
>>> a = 'cdbe'
>>> id(a),id(b)                       这里位置不同了
(140476357878336, 140476358384784) 

>>> name_info
{'job': 'Engineer', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}
>>> info2 = name_info
>>> info2
{'job': 'Engineer', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}
>>> name_info['job'] = 'HR'                           这里修改了,name_info和info2都被改了,因为内存地址相同
>>> info2
{'job': 'HR', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}
>>> name_info
{'job': 'HR', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}

>>> info2['job'] = 'Sales'                            同上,因为内存位置指针一样
>>> info2
{'job': 'Sales', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}

name_info和info2内存地址一样
>>> id(info2['job'])
140476357878240
>>> id(name_info['job'])
140476357878240
字典里每个key都有自己的内存指针位置
>>> id(name_info['age'])  
36360344
>>> id(name_info['stuID'])
36636488

为什么要把内存指针指向一个位置呢?为了减少内存空间消耗,类是于软连接。

copy浅复制(复制一份)
>>> info3 = name_info.copy()
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'age': 29, 'stuID': 1123, 'addr': 'beijing'}
>>> info3
{'age': 29, 'job': 'Sales', 'stuID': 1123, 'name': 'jacky', 'addr': 'beijing'}
>>> name_info['Sex'] = 'M'
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'age': 29, 'Sex': 'M', 'stuID': 1123, 'addr': 'beijing'}
>>> info3
{'age': 29, 'job': 'Sales', 'stuID': 1123, 'name': 'jacky', 'addr': 'beijing'}
>>> name_info['age'] = 80
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'beijing'}
>>> info3
{'age': 29, 'job': 'Sales', 'stuID': 1123, 'name': 'jacky', 'addr': 'beijing'}
>>> info3['nationality'] = 'chinese'
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'beijing'}
>>> info3
{'name': 'jacky', 'age': 29, 'job': 'Sales', 'nationality': 'chinese', 'stuID': 1123, 'addr': 'beijing'}
>>> name_info['ex_list'] = ['Coral','Erion']
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'beijing'}
>>> info4 = name_info.copy()
>>> info4
{'addr': 'beijing', 'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'stuID': 1123, 'Sex': 'M'}

这里来了一个问题,只管一层
>>> name_info['ex_list'] = ['Coral','Erion']         这里是第二层
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'beijing'}
>>> info4 = name_info.copy()
>>> info4
{'addr': 'beijing', 'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'stuID': 1123, 'Sex': 'M'}
>>> name_info['addr'] = 'HongKong'      第一层修改ok,两边不一致了
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'HongKong'}
>>> info4
{'addr': 'beijing', 'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion'], 'age': 80, 'stuID': 1123, 'Sex': 'M'}

>>> name_info['ex_list'].append('Wutenlan')   第二层依然一起修改
>>> info4
{'addr': 'beijing', 'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion', 'Wutenlan'], 'age': 80, 'stuID': 1123, 'Sex': 'M'}
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion', 'Wutenlan'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'HongKong'}

深复制(第二层也是复制,两份不同的指针)
import copy
copy.copy浅复制(复制一份)
deepcopy是深复制
>>> import copy
>>> info5 = copy.deepcopy(name_info)
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion', 'Wutenlan'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'HongKong'}
>>> name_info['ex_list'][2] = 'LongZeluola'
>>> name_info
{'job': 'Sales', 'name': 'jacky', 'ex_list': ['Coral', 'Erion', 'LongZeluola'], 'age': 80, 'Sex': 'M', 'stuID': 1123, 'addr': 'HongKong'}
>>> info5
{'name': 'jacky', 'ex_list': ['Coral', 'Erion', 'Wutenlan'], 'age': 80, 'Sex': 'M', 'job': 'Sales', 'stuID': 1123, 'addr': 'HongKong'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值