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中list常用操作实例详解
Jun 03 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
python中时间模块的基本使用教程
May 14 Python
微信小程序python用户认证的实现
Jul 29 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
python两个list[]相加的实现方法
Sep 23 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
pytorch常用数据类型所占字节数对照表一览
May 17 Python
python多次执行绘制条形图
Apr 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中使用Oracle数据库(3)
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python之列表的插入&替换修改方法
2018/06/28 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python Django的web开发实例(入门)
2019/07/31 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
python定义类的简单用法
2020/07/24 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
如何通过python计算圆周率PI
2020/11/11 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
教师简历自我评价
2014/02/03 职场文书
《小草和大树》教学反思
2014/02/16 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
九华山导游词
2015/02/03 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
学生安全责任协议书
2016/03/22 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python