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 相关文章推荐
tensorflow构建BP神经网络的方法
Mar 12 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
浅析Python函数式编程
Oct 06 Python
python读取几个G的csv文件方法
Jan 07 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
Python编解码问题及文本文件处理方法详解
Jun 20 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调用Mailgun发送邮件的方法
2017/05/04 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python实现感知器算法详解
2017/12/19 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
国贸专业个人求职信范文
2014/01/08 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL