深入浅析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中使用M2Crypto模块实现AES加密的教程
Apr 08 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
对pandas中to_dict的用法详解
Jun 05 Python
python如何创建TCP服务端和客户端
Aug 26 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
Pandas 缺失数据处理的实现
Nov 04 Python
Python字符串的修改方法实例
Dec 19 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
python读取mat文件生成h5文件的实现
Jul 15 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/04/28 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
AngularJS入门之动画
2016/07/27 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python 的描述符 descriptor详解
2016/02/27 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
彪马法国官网:PUMA法国
2019/12/15 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
《猴子种果树》教学反思
2014/04/26 职场文书
爱心倡议书范文
2014/05/12 职场文书
班组建设经验交流材料
2014/05/12 职场文书
写字楼租赁意向书
2014/07/30 职场文书
文明单位申报材料
2014/12/23 职场文书
合同补充协议书
2016/03/24 职场文书
六年级作文之预言作文
2019/10/25 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS