深入浅析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读写json文件的简单实现
Apr 11 Python
Python Json序列化与反序列化的示例
Jan 31 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Python基于requests库爬取网站信息
Mar 02 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
Django通过设置CORS解决跨域问题
Nov 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Numpy掩码式数组详解
2018/04/17 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
班级聚会策划书
2014/01/16 职场文书
社区十八大感言
2014/01/19 职场文书
给物业的表扬信
2014/01/21 职场文书
施工安全责任书
2014/04/14 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
前台接待员岗位职责
2015/04/15 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android