yujin2010good
作者yujin2010good·2018-12-19 09:58
系统工程师·大型零售巨头

python浅复制与深复制

字数 4085阅读 976评论 1赞 2

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'}

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

asdf-asdfasdf-asdf研究学者cloudstone
2018-12-20 10:16
曾经当年遇到这个坑,返回的json串一致会变化, 翻遍所有程序后发现一小伙使用了浅copy, 所以基础知识太重要了,不然浪费了一个team3个人2小时时间,算下来成本下一跳
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广