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类装饰器用法实例
Jun 04 Python
理解Python中的With语句
Mar 18 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python中调用其他程序的方式详解
Aug 06 Python
python各类经纬度转换的实例代码
Aug 08 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
python爬虫筛选工作实例讲解
Nov 23 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注销代码(session注销)
2012/05/31 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python代码实现KNN算法
2017/12/20 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
毕业生自荐书
2014/02/02 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
JavaScript中reduce()的用法
2022/05/11 Javascript
volatile保证可见性及重排序方法
2022/08/05 Java/Android