Python基础教程之浅拷贝和深拷贝实例详解


Posted in Python onJuly 15, 2017

Python基础教程之浅拷贝和深拷贝实例详解

           网上关于Python的深拷贝和浅拷贝的文章很多,这里对三种拷贝进行比较并附实例,大家可以参考下

一般的复制

#encoding:utf-8
#定义一个嵌套集合
lista=[1,2,3,[4,5,6,[7,8,9]]]

listb=lista
#分别打印出 lista和listb的地址值
print id(lista) #4511103096
print id(listb) #4511103096

#修改lista中的内容,listb中的内容也会跟着修改

lista[0]=0
print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。

浅拷贝

#encoding:utf-8
#定义一个嵌套集合
import copy
lista=[1,2,3,[4,5,6,[7,8,9]]]
#使用copy模块中copy方法
listb=copy.copy(lista)

print id(lista) #4396231640

print id(listb) #4396231712

#发现lista和listb在内存中的地址有区别,
#打印元素中的第一个元素的地址值
print id(lista[0])#140666751466536

print id(listb[0])#140666751466536

#元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素,
# listb中的也要改变呢

lista[0]=0

print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

#结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗
#我们在打印下lista[0]和listb[0]的地址
print id(lista[0]) #140666751466560

print id(listb[0]) #140666751466536

#会发现lista[0]重新指向内存中的其他地址


#这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list

print id(lista[3])#4499779240

print id(listb[3])#4499779240

#修改lista[3]中第一个元素呢

lista[3][0]=0

print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

#发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变

根据以上实践说明,浅拷贝对对象中对象没有拷贝。

深拷贝

#encoding:utf-8
  #定义一个嵌套集合
  import copy
  lista=[1,2,3,[4,5,6,[7,8,9]]]

  #深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能
  listb=copy.deepcopy(lista)

  lista[3][0]=0

  print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]]

  print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

  #深拷贝会解决修改lista[3][0]值不会影响listb中的值

  #再来修改下第三层列表中元素是不是也完成拷贝

  lista[3][3][0]=0

  print lista #[1, 2, 3, [0, 5, 6, [0, 8, 9]]]

  print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

  #没有受到任何影响

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
python3.3实现乘法表示例
Feb 07 Python
Python数组定义方法
Apr 13 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
对python调用RPC接口的实例详解
Jan 03 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
Django Model中字段(field)的各种选项说明
May 19 Python
python实现126邮箱发送邮件
May 20 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
如何利用python进行时间序列分析
Aug 04 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 #Python
Python实现发送QQ邮件的封装
Jul 14 #Python
python记录程序运行时间的三种方法
Jul 14 #Python
python运行其他程序的实现方法
Jul 14 #Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 #Python
Python学习教程之常用的内置函数大全
Jul 14 #Python
python与C互相调用的方法详解
Jul 14 #Python
You might like
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
理解javascript回调函数
2014/12/28 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python批量修改ssh密码的实现
2019/08/08 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
你常见到的runtime exception
2016/09/05 面试题
普天C++笔试题
2016/03/20 面试题
学习党课思想汇报
2013/12/29 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
请假条怎么写
2014/04/10 职场文书
文明市民先进事迹
2014/05/15 职场文书
视光学专业自荐信
2014/06/24 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL