对于Python深浅拷贝的理解


Posted in Python onJuly 29, 2019

1,浅拷贝是什么?

浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容

对于Python深浅拷贝的理解

通过a=b这种方式赋值只是赋值的引用(内存地址),a和b都指向了同一个内存空间,所以他们的id(地址相同),这种就是浅拷贝

2,深拷贝是什么?

对于Python深浅拷贝的理解

通过调用copy包里的deepcopy方法来深拷贝,其实就是在内存区在分配保存了和a相同的数据,用c来指向它,和a的内存地址不同。怎么验证就是我说的这种情况的呢?用下图来说明吧:

对于Python深浅拷贝的理解

可以看出向a 添加一个元素,通过浅拷贝的b也随着改了,但是通过深拷贝的c没改,可以判断c和a指向不同的内存地址。

如果是类似这种结构的数据的深拷贝呢:

对于Python深浅拷贝的理解

深拷贝d时其实把a里面的a,b都深拷贝了一份,是递归式的深拷贝。

通过验证就是如图所示:

对于Python深浅拷贝的理解

3,浅拷贝对不可变类型和可变类型的copy不同

In [88]: a = [11,22,33]

In [89]: b = copy.copy(a)

In [90]: id(a)
Out[90]: 59275144

In [91]: id(b)
Out[91]: 59525600

In [92]: a.append(44)

In [93]: a
Out[93]: [11, 22, 33, 44]

In [94]: b
Out[94]: [11, 22, 33]

In [95]: a = (11,22,33)

In [96]: b = copy.copy(a)

In [97]: id(a)
Out[97]: 58890680

In [98]: id(b)
Out[98]: 58890680

在python中:数字,字符串,元组属于不可变类型,其他的属于可变类型。

>>> a=(1,2,3)
>>> a
(1, 2, 3)
>>> b=a
>>> id(b)
11543656
>>> id(a)
11543656
>>> import copy
>>> c
34564
>>> c=copy.deepcopy(a)
>>> c
(1, 2, 3)
>>> id(c)
11543656
>>> d=copy.copy(a)
>>> id(d)
11543656

可以看出对于可变类型使用copy方法是深拷贝,对于不可变类型,使用copy和deepcopy方法都是浅拷贝

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现批量下载图片的方法
Jul 08 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
Python常见工厂函数用法示例
Mar 21 Python
python实现决策树ID3算法的示例代码
May 30 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python opencv读mp4视频的实例
Dec 07 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
python实现按首字母分类查找功能
Oct 31 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
python中tab键是什么意思
Jun 18 Python
python文件目录操作之os模块
May 08 Python
PyCharm中代码字体大小调整方法
Jul 29 #Python
python pandas cumsum求累计次数的用法
Jul 29 #Python
详解Python用三种方式统计词频的方法
Jul 29 #Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 #Python
Django 重写用户模型的实现
Jul 29 #Python
python写程序统计词频的方法
Jul 29 #Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 #Python
You might like
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
angular-cli修改端口号【angular2】
2017/04/19 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
Python异常处理总结
2014/08/15 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
解决yum对python依赖版本问题
2019/07/05 Python
python中eval与int的区别浅析
2019/08/11 Python
python字符串判断密码强弱
2020/03/18 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
python实现最短路径的实例方法
2020/07/19 Python
django和flask哪个值得研究学习
2020/07/31 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
学校介绍信范文
2014/01/14 职场文书
反邪教标语
2014/06/23 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript