深入理解python中的浅拷贝和深拷贝


Posted in Python onMay 30, 2016

在讲什么是深浅拷贝之前,我们先来看这样一个现象:

a = ['scolia', 123, [], ]
b = a[:]
b[2].append(666)
print a
print b

深入理解python中的浅拷贝和深拷贝

为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用。

深入理解python中的浅拷贝和深拷贝

所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a。

a = ['scolia', 123, [], ]
b = a[:]
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

代码验证无误,所以虽然a和b是两个不同的对象,但是里面的引用都是一样的。这就是所谓新的对象,旧的内容。

但是,浅拷贝还不仅如此,看下面:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print a
print b

深入理解python中的浅拷贝和深拷贝

这又是怎么回事呢?

看过我在python变量赋值说明的同学会知道:对于字符串、数字等不可变的数据类型,修改就相当于重新赋值。在这里就相当于刷新引用。

深入理解python中的浅拷贝和深拷贝

代码验证一下:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

看来是正确的。

上面讲的这些就是浅拷贝,总结起来,浅拷贝只是拷贝了一系列引用,当我们在拷贝出来的对象对可修改的数据类型进行修改的时候,并没有改变引用,所以会影响原对象。而对不可修改的对象进行修改的是,则是新建了对象,刷新了引用,所以和原对象的引用不同,结果也就不同。

创建浅拷贝的方法:

1.切片操作

2.使用list()工厂函数新建对象。( b = list(a) )

那么深拷贝不就是将里面引用的对象重新创建了一遍并生成了一个新的一系列引用。

基本上是这样的,但是对于字符串、数字等不可修改的对象来说,重新创建一份似乎有点浪费内存,反正你到时要修改的时候都是新建对象,刷新引用的。所以还用原来的引用也无所谓,还能达到节省内存的目的。

深入理解python中的浅拷贝和深拷贝

看下代码验证:

from copy import deepcopy
a = ['scolia', 123, [], ]
b = deepcopy(a)
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

验证正确。

深拷贝的创建:

1.正如代码示例用一样,只能通过内置的copy模块的deepcopy()方法创建。

好了,关于深浅拷贝的问题就先说到这里,有什么错误或需要补充的以后会继续。

以上这篇深入理解python中的浅拷贝和深拷贝就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
线程和进程的区别及Python代码实例
Feb 04 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python 常用的安装Module方式汇总
May 06 Python
Python学习入门之区块链详解
Jul 25 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
简单了解Django ContentType内置组件
Jul 23 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python 错误处理 assert详解
Apr 20 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
浅谈Python的文件类型
May 30 #Python
python中string模块各属性以及函数的用法介绍
May 30 #Python
Python 常用string函数详解
May 30 #Python
整理Python 常用string函数(收藏)
May 30 #Python
深入浅析python继承问题
May 29 #Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 #Python
python自动翻译实现方法
May 28 #Python
You might like
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
PHP session 会话处理函数
2016/06/06 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
关于js类的定义
2011/06/28 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
JS实现多功能计算器
2020/10/28 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python3中str(字符串)的使用教程
2017/03/23 Python
python实现日常记账本小程序
2018/03/10 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
出生医学证明样本
2014/01/17 职场文书
迟到检讨书300字
2014/02/14 职场文书
环保口号大全
2014/06/12 职场文书
学校运动会广播稿
2014/10/11 职场文书
个人总结与自我评价
2015/02/14 职场文书
停电放假通知
2015/04/14 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
工作态度检讨书范文
2015/05/06 职场文书
小学中队活动总结
2015/05/11 职场文书
结婚幸福感言
2015/08/01 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python