编程语言
首页 > 编程语言> > python 直接赋值 深拷贝 浅拷贝

python 直接赋值 深拷贝 浅拷贝

作者:互联网

目录
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