对于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生成不重复随机值的方法
May 11 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
Python的形参和实参使用方式
Dec 24 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
django创建css文件夹的具体方法
Jul 31 Python
Python容器类型公共方法总结
Aug 19 Python
关于Python错误重试方法总结
Jan 03 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 Python
Python实现位图分割的效果
Nov 20 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定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
JS array 数组详解
2009/03/22 Javascript
Prototype Date对象 学习
2009/07/12 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
常用python编程模板汇总
2016/02/12 Python
Python常用库推荐
2016/12/04 Python
Python 含参构造函数实例详解
2017/05/25 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python openssl模块安装及用法
2020/12/06 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
传播学毕业生求职信
2013/10/11 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
大学社团活动总结
2014/04/26 职场文书
自强之星事迹材料
2014/05/12 职场文书
联片教研活动总结
2014/07/01 职场文书
就业证明函
2015/06/17 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript