百木园-与人分享,
就是让自己快乐。

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完全不相关,不存在任何共享。


来源:https://www.cnblogs.com/chkplusplus/p/15980817.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » python 直接赋值 深拷贝 浅拷贝

相关推荐

  • 暂无文章