深入浅析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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
python实现简单爬虫功能的示例
Oct 24 Python
Python中int()函数的用法浅析
Oct 17 Python
浅谈Python爬虫基本套路
Mar 25 Python
python如何删除文件中重复的字段
Jul 16 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python音频处理的示例详解
Dec 23 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
python实现简单的三子棋游戏
Apr 28 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
PHP运行模式的深入理解
2013/06/03 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
Python 解析XML文件
2009/04/15 Python
python实现巡检系统(solaris)示例
2014/04/02 Python
Python中的闭包实例详解
2014/08/29 Python
python实现查询苹果手机维修进度
2015/03/16 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
python修改字典内key对应值的方法
2015/07/11 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python实现在一个画布上画多个子图
2020/01/19 Python
索尼巴西商店:Sony巴西
2019/06/21 全球购物
校园网站的创业计划书范文
2013/12/30 职场文书
承诺书格式范文
2014/06/03 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
励志演讲稿800字
2014/08/21 职场文书
个人整改方案范文
2014/10/25 职场文书
质量整改报告范文
2014/11/08 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers