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求素数示例分享
Feb 16 Python
Python中的元类编程入门指引
Apr 15 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
python实现Zabbix-API监控
Sep 17 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Python WSGI 规范简介
Apr 11 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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&&mysql)六
2006/10/09 PHP
一个颜色轮换的简单例子
2006/10/09 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
javascript new一个对象的实质
2010/01/07 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
node后端服务保活的实现
2019/11/10 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
用python读取xlsx文件
2020/12/17 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
办公室年终个人自我评价
2013/10/28 职场文书
购房意向书
2014/04/01 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript