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登录QQ邮箱发信的实现代码
Feb 10 Python
python实现数通设备tftp备份配置文件示例
Apr 02 Python
Python标准库os.path包、glob包使用实例
Nov 25 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
Python Queue模块详细介绍及实例
Dec 27 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
django解决跨域请求的问题
Nov 11 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
浅谈django 重载str 方法
May 19 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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对象转换为数组函数(递归方法)
2012/02/04 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
javascript基本语法分析说明
2008/06/15 Javascript
js CSS操作方法集合
2008/10/31 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
python批量导出导入MySQL用户的方法
2013/11/15 Python
python实现ip查询示例
2014/03/26 Python
python实现Floyd算法
2018/01/03 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
python sorted函数原理解析及练习
2020/02/10 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
总账会计岗位职责
2014/03/13 职场文书
教师节演讲稿
2014/05/06 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
人事文员岗位职责
2015/02/04 职场文书
反邪教观后感
2015/06/11 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书