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程序的执行原理
Apr 11 Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
pyenv命令管理多个Python版本
Mar 26 Python
pandas string转dataframe的方法
Apr 11 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Python 没有main函数的原因
Jul 10 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
python 用struct模块解决黏包问题
Nov 07 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函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
jQuery使用手册之三 CSS操作
2007/03/24 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
vue开发心得和技巧分享
2016/10/27 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
Python处理文本换行符实例代码
2018/02/03 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
电子专业推荐信范文
2013/11/18 职场文书
应聘收银员个人的求职信
2013/11/30 职场文书
采购助理岗位职责
2014/02/16 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
爱国主义电影观后感
2015/06/18 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang