深入浅析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基础教程之数字处理(math)模块详解
Mar 25 Python
python实现的一个p2p文件传输实例
Jun 04 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
PHP实现发送和接收JSON请求
Jun 07 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
tensorflow如何批量读取图片
Aug 29 Python
python集合删除多种方法详解
Feb 10 Python
python怎么判断模块安装完成
Jun 19 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
python 写一个文件分发小程序
Dec 05 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
德生S2000电路分析
2021/03/02 无线电
PHP 中dirname(_file_)讲解
2007/03/18 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
PHP修改session_id示例代码
2014/01/08 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
window.open的功能全解析
2006/10/10 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
js跳转页面方法总结
2014/01/29 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Python求离散序列导数的示例
2019/07/10 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
机关职员工作检讨书
2014/10/23 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL