以dict为例谈谈深拷贝与浅拷贝

简介: 正式的Python专栏第30篇,同学站住,别错过这个从0开始的文章!

学委前面展示dict的概念和常用操作,谈到了一个shadow copy产生的新dict对象受到原dict对象影响。


这篇我们继续看看深拷贝,


深拷贝是什么?

我们拿字典的复制可以通过copy函数来实现,但是它是浅拷贝,也就是拷贝了但不完全拷贝


简单粗暴来说浅拷贝就是拷贝key,但是新字典的值还是沿用旧字典的值的引用(内存地址一样)。


与浅拷贝对比,深拷贝就是除了拷贝key,新字典的值不会沿用旧字典值的引用,而是创建类似的数据,引用分开!


也就是内存分配两个空间内串联起来的数据块,是可以做到毫无关联!


我们看看字典的深浅拷贝对比代码示例:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/6 11:25 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thecopy.py
# @Project : hello
import copy  # 引入了copy模块,3.8自带的模块
info_dict = dict()
info_dict['name'] = 'LEI_XUE_WEI'  # 或者改为 'levin'
info_dict['blogs'] = '95'  # 目前发表了93个博客文字。
info_dict['gongzhong_hao'] = '【雷学委】'  # 欢迎过来关注支持
info_dict['meta-data'] = dict()
print('info_dict:', info_dict)
print("*" * 16)
# 浅拷贝//Shadow Copy: 全拷贝但不完全拷贝
shadow_copied_dict = info_dict.copy()  # 也可以使用: copy.copy(info_dict)
print("shadow_copied_dict :", shadow_copied_dict)
deepcopied_dict = copy.deepcopy(info_dict)
print("deepcopied_dict :", deepcopied_dict)
# 我们修改原始的dict
info_dict['meta-data']['date'] = '06 Nov 2021'
print('info_dict:', info_dict)
print('shadow_copied_dict:', shadow_copied_dict)  # 这里输出看到变化也传递给了 shadow_copied_dict
print('deepcopied_dict:', deepcopied_dict)  # 这里输出看到变化也传递给了 deepcopied_dict

效果如下:

image.png

从这里看,我们发现两个拷贝的字典,浅拷贝因为被拷贝的字典产生变更而更新了。


而深拷贝产生的deepcopied_dict对象则纹丝不动!


这里还得说一下copy模块。


稍微说说copy.deepcopy函数的原理

考虑到基础系列专栏,这一段会比较难以理解,我会再以后的文章更加细致讲。


这里只针对dict对象的拷贝做带过:


deepcopy内部通过_deepcopy_dispatch对象查找字典(dict)的拷贝器

拷贝器定义的拷贝方法遍历原字典对象

依次对key 和 value 进行深度拷贝

就这么简单,如果key和value还不是最简单的类型(比如int/float/str等),继续查找拷贝器,遍历进行拷贝,直到基础类型直接返回,然后回溯。


小白可以跳过这一段继续学习,先把基础熟练了。


总结

深拷贝和浅拷贝涉及的技术很多。


本篇只是介绍了怎么进行深拷贝(借用copy模块),也侧重于展示和使用介绍


如果不用怎么实现呢?


当然copy模块也给了我们一个参考答案,但这个背后涉及了pickle序列化反序列化还有内存管理等,不难但篇幅更长以后再说。



目录
相关文章
|
11月前
|
Java
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
|
4月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
|
4月前
|
Python
请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
【2月更文挑战第25天】【2月更文挑战第84篇】请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
26 0
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
80 0
List浅拷贝和深拷贝图解
List浅拷贝和深拷贝图解
88 0
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
110 0
|
机器学习/深度学习 C++ Python
Python应用专题 | 8:字典内存释放及其浅拷贝和深拷贝之间的区别
本文主要介绍字典内存释放及其浅拷贝和深拷贝之间的区别
|
前端开发
前端学习案例10-深拷贝和浅拷贝
前端学习案例10-深拷贝和浅拷贝
68 0
前端学习案例10-深拷贝和浅拷贝
|
JavaScript 前端开发 Java
一文搞懂浅拷贝与深拷贝到底有什么区别
一文搞懂浅拷贝与深拷贝到底有什么区别
150 0
|
存储 程序员 Python
深度解析Python的赋值、浅拷贝、深拷贝
直接赋值: 其实就是指向对象的引用(别名)。 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。但对于不可变数据类型,不会拷贝,仅仅是指向 深拷贝(deepcopy):`copy` 模块的 `deepcopy` 方法,完全拷贝了父对象及其子对象。 拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。