深入浅析Python中list的复制及深拷贝与浅拷贝


Posted in Python onSeptember 03, 2018

在Python中,经常要对一个list进行复制。对于复制,自然的就有深拷贝与浅拷贝问题。深拷贝与浅拷贝的区别在于,当从原本的list复制出新的list之后,修改其中的任意一个是否会对另一个造成影响,即这两个list在内存中是否储存在同一个区域,这也是区分深拷贝与浅拷贝的重要依据。接下来我们就针对Python中list复制的几种方法,来探究一下其是属于深拷贝还是浅拷贝。弄清楚这个问题,有助于我们在编程中规避错误,减少不必要的调试时间。

一、非拷贝方法——直接赋值

如果用=直接赋值,是非拷贝方法。这两个列表是等价的,修改其中任何一个列表都会影响到另一个列表。这也是Python作为动态语言与C这类静态语言在思想上的不同之处。

#!/usr/bin/env python3
 # -*- coding: utf-8 -*- 
 old = [1, [1, 2, 3], 3]
 new = old
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

二、浅拷贝的几种方法

1.copy()方法

我们来看以下代码:

#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 old = [1, [1, 2, 3], 3]
 new = old.copy()
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

对于list的第一层,是实现了深拷贝,但对于嵌套的list,仍然是浅拷贝。这其实很好理解,内层的list保存的是地址,复制过去的时候是把地址复制过去了。嵌套的list在内存中指向的还是同一个。

深入浅析Python中list的复制及深拷贝与浅拷贝

2.使用列表生成式

使用列表生成式产生新列表也是一个浅拷贝方法,只对第一层实现深拷贝。

#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 old = [1, [1, 2, 3], 3]
 new = [i for i in old]
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

3.用for循环遍历

通过for循环遍历,将元素一个个添加到新列表中。这也是一个浅拷贝方法,只对第一层实现深拷贝。

#!/usr/bin/env python3
 # -*- coding: utf-8 -*- 
 old = [1, [1, 2, 3], 3]
 new = []
 for i in range(len(old)):
 new.append(old[i])
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

4.使用切片

通过使用[:]切片,可以浅拷贝整个列表。同样的,只对第一层实现深拷贝。

#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 old = [1, [1, 2, 3], 3]
 new = old[:]
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

三、深拷贝的实现

如果用deepcopy()方法,则无论多少层,无论怎样的形式,得到的新列表都是和原来无关的,这是最安全最清爽最有效的方法。

使用时,要导入copy。

#!/usr/bin/env python3
 # -*- coding: utf-8 -*- 
 import copy 
 old = [1, [1, 2, 3], 3]
 new = copy.deepcopy(old)
 print('Before:')
 print(old)
 print(new)
 new[0] = 3
 new[1][0] = 3
 print('After:')
 print(old)
 print(new)

 运行结果:

深入浅析Python中list的复制及深拷贝与浅拷贝

总结

以上所述是小编给大家介绍的Python中list的复制及深拷贝与浅拷贝探究,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python进程管理工具supervisor使用实例
Sep 17 Python
python检测某个变量是否有定义的方法
May 20 Python
python简单实现获取当前时间
Aug 27 Python
Django处理文件上传File Uploads的实例
May 28 Python
Python微医挂号网医生数据抓取
Jan 24 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
python 发送get请求接口详解
Nov 17 Python
python 发送邮件的四种方法汇总
Dec 02 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
python实现的web监控系统
Apr 27 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 #Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 #Python
Python中关键字global和nonlocal的区别详解
Sep 03 #Python
python leetcode 字符串相乘实例详解
Sep 03 #Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 #Python
Python实现多级目录压缩与解压文件的方法
Sep 01 #Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 #Python
You might like
基于mysql的bbs设计(三)
2006/10/09 PHP
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
jquery 模板的应用示例
2013/11/12 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
python实现简单俄罗斯方块
2020/03/13 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
工程资料员岗位职责
2014/03/10 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
人力资源职位说明书
2014/07/29 职场文书
儿园租房协议书范本
2014/12/02 职场文书
故宫导游词
2015/01/31 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python