ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 直接赋值 深拷贝 浅拷贝

2022-03-08 16:34:09  阅读:217  来源: 互联网

标签:name python country age China Kang 拷贝 赋值


目录
python中的深拷贝与浅拷贝与C&C++中略有不同,后者主要是对于指针指向内存空间的重新开辟,否则两个指针会共享一块内存,而python中是三种不同层次的共享。其中直接复制是用 = ,浅拷贝和深拷贝则要使用copy模块实现。

直接赋值

d = {'country':'China', 'age': '18', 'name': 'Kang'}

a = d
print(a, d)
d['age'] = 100
print(a, d)
d['like'] = 'pingpong'
print(a, d)

输出:

{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'}
{'country': 'China', 'age': 100, 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang'}
{'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'} {'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'}

直接赋值的时候 a与d完全相同,类似C中的引用概念,是一个对象的两个别名,因此无论是改变d中原有元素还是给d添加新的元素,a都是随之改变。

浅拷贝

直接赋值是两个对象完全共享,浅拷贝则是共享拷贝时候已有的元素,对于添加的新元素则不共享。

import copy

d = {'country':'China', 'age': '18', 'name': 'Kang'}

a = copy.copy(d)
print(a, d)
d['age'] = 100
print(a, d)
d['like'] = 'pingpong'
print(a, d)

输出:

{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': '18', 'name': 'Kang'}
{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang'}
{'country': 'China', 'age': '18', 'name': 'Kang'} {'country': 'China', 'age': 100, 'name': 'Kang', 'like': 'pingpong'}

嗯,第三行是对的,对于新添加的元素不会共享。但本来以为改变原字典d的age的值,a会跟着改变的,毕竟age是共享时已有的元素嘛,但这里发现好像打脸了,第二行输出d的age改变而a没有改变,这是因为字典的值更改了以后就相当于一个新的元素了。以下小实验可验证:

d = {'age': 18}
print(id(d['age']))
d['age'] = 10000
print(id(d['age']))

输出为:

93899669444160
139985819449552

可以认为id()函数输出对象的地址,可以看到这里地址已经改变了,所以d的age键值对改变前后是两个元素。
即,浅拷贝时子元素共享是对的,但是要注意改变子元素时有没有改变其地址,把原本共享的子元素对象直接改成另一个对象,那肯定不再共享了。

深拷贝

a = copy.deepcopy(d)

这种情况下a和d完全不相关,不存在任何共享。

标签:name,python,country,age,China,Kang,拷贝,赋值
来源: https://www.cnblogs.com/chkplusplus/p/15980817.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有