深入浅析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简单实现基于SSL的IRC bot实例
Jun 15 Python
Python学习入门之区块链详解
Jul 25 Python
python批量读取txt文件为DataFrame的方法
Apr 03 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
tensorflow实现简单的卷积网络
May 24 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 Python
方法汇总:Python 安装第三方库常用
Apr 26 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使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
基于Python fminunc 的替代方法
2020/02/29 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
银行实习自我鉴定
2013/10/12 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
广告创意求职信
2014/03/17 职场文书
《海底世界》教学反思
2014/04/16 职场文书
创建文明城市标语
2014/06/16 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
maven依赖的version声明控制方式
2022/01/18 Java/Android