愿君学长松,慎勿作桃李。这篇文章主要讲述Python对象的浅拷贝与深拷贝相关的知识,希望能为你提供帮助。
在讲我们深浅拷贝之前,我们需要先区分一下拷贝和赋值的概念。看下面的例子
a = [1,2,3]
赋值:
b = a
拷贝:
b = a.copy()
上面的两行代码究竟有什么不同呢?带着这个问题,继续
文章图片
看了上面这张图,相信大家已经对直接赋值和拷贝有了一个比较清楚的认识。
我们的深浅拷贝只是对于可变对象来讨论的。 不熟悉的朋友需要自己去了解可变对象与不可变对象哦。
1. 对象的嵌套引用
a = { "list": [1,2,3] }
上面的代码,在内存中是什么样子的呢?请看下图:
文章图片
【Python对象的浅拷贝与深拷贝】原来,在我们的嵌套对象中,子对象也是一个引用。
1. 浅拷贝
文章图片
如上图所示,我们就可以很好的理解什么叫做浅拷贝了。
上面 的 a 和 c 是一个独立的对象,但他们的子对象还是指向统一对象
1.1 浅拷贝的方法
.copy()
a = {"list": [1,2,3] } b = a.copy()
copy模块
import copy a = {"list": [1,2,3] } b = copy.copy(a)
列表切片[:]
a = [1,2,3,[1,2,3]] b = a[1:]
for循环
a = [1,2,3,[1,2,3]] b = [] for i in a: b.append(i)
a = {"list":[1,2,3]}
b = a.copy()
a["list"].append(4)print(a)
# {list: [1, 2, 3, 4]}print(b)
# {list: [1, 2, 3, 4]}
在上面的例子中,我们明明只改变 a 的子对象,却发现 b 的子对象也跟着改变了。这样在我们的程序中也许会引发很多的BUG。
2. 深拷贝上面我们知道了什么是浅拷贝,那我们的深拷贝就更好理解了。
文章图片
import copy
a = {"list":[1,2,3]}
b = copy.deepcopy(a)
a["list"].append(4)print(a)
# {list: [1, 2, 3, 4]}print(b)
# {list: [1, 2, 3,]}
上面的例子中,我们再次修改 a 的子对象对 b 已经没有任何影响
3. 手动实现一个深拷贝主要采用递归的方法解决问题。判断拷贝的每一项子对象是否为引用对象。如果是就采用递归的方式将子对象进行复制。
def deepcopy(instance):
if isinstance(instance, dict):
return {k:deepcopy(v) for k,v in instance.items() }elif isinstance(instance, list):
return [deepcopy(x) for x in instance]else:
return instancea = {"list": [1,2,3]}
b = deepcopy(a)print(a)
# {list: [1, 2, 3]}print(b)
# {list: [1, 2, 3]}a["list"].append(4)
print(a)
# {list: [1, 2, 3, 4]}print(b)
# {list: [1, 2, 3]}
创作不易,且读且珍惜。如有错漏还请海涵并联系作者修改,内容有参考,如有侵权,请联系作者删除。如果文章对您有帮助,还请动动小手,您的支持是我最大的动力。
文章图片
关注小编公众号:偷偷学习,卷死他们
推荐阅读
- 11.22-11.28博客精彩回顾
- Spring认证中国教育管理中心-Spring Data Redis框架教程一
- DellEMC Avamar 备份报错 error code 30931
- 如何在WordPress Sparkling主题中更改页脚内容
- 如何在wp-admin菜单,页面标题和帖子编辑器中更改”标签”
- 如何更改hestia上的seciton顺序( [关闭])
- 如何更改归档标题以使用分类标签的复数形式而不是单数形式
- 如何在WooCommerce中选择结帐国家/地区时更改悬停颜色()
- 如何在Apostrophe主题上更改帖子标题