深入理解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使用Berkeley DB数据库实例
Sep 26 Python
Python中实现最小二乘法思路及实现代码
Jan 04 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
Python3实现定时任务的四种方式
Jun 03 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
python redis 批量设置过期key过程解析
Nov 26 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
python必学知识之文件操作(建议收藏)
May 30 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
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
python调用自定义函数的实例操作
2019/06/26 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
校园之声广播稿
2014/01/31 职场文书
中学教师请假制度
2014/02/03 职场文书
2014国庆节标语口号
2014/09/19 职场文书
就业意向协议书
2015/01/29 职场文书
总经理司机岗位职责
2015/04/10 职场文书
天河观后感
2015/06/11 职场文书
大学同学聚会感言
2015/07/30 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
SQL Server表分区删除详情
2021/10/16 SQL Server