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 相关文章推荐
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Pycharm学习教程(2) 代码风格
May 02 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
获取python的list中含有重复值的index方法
Jun 27 Python
对Python3 序列解包详解
Feb 16 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
python:动态路由的Flask程序代码
Nov 22 Python
python画图常规设置方式
Mar 05 Python
如何用python插入独创性声明
Mar 31 Python
python 离散点图画法的实现
Apr 01 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 Python
python 使用pandas读取csv文件的方法
Dec 24 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
程序员编程十条戒律
2009/07/09 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php中的三元运算符使用说明
2011/07/03 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
vue v-for 使用问题整理小结
2019/08/04 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
Python易忽视知识点小结
2015/05/25 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
python excel转换csv代码实例
2019/08/26 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
校领导推荐信
2013/11/01 职场文书
升职自荐书范文
2013/11/28 职场文书
自主招生自荐信
2013/12/08 职场文书
春节超市活动方案
2014/08/14 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
大学体育课感想
2015/08/10 职场文书
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL