深入浅析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 StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python实现LRU算法的2种方法
Jun 24 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python添加模块搜索路径方法
Sep 11 Python
python调用摄像头显示图像的实例
Aug 03 Python
对python周期性定时器的示例详解
Feb 19 Python
python django model联合主键的例子
Aug 06 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
python对Excel的读取的示例代码
Feb 14 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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中正确的使用json
2013/08/06 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
python实现简单温度转换的方法
2015/03/13 Python
Python实现简单字典树的方法
2016/04/29 Python
python中异常报错处理方法汇总
2016/11/20 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
python字符串下标与切片及使用方法
2020/02/13 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
广告语设计及教案
2014/03/21 职场文书
实习单位评语
2014/04/26 职场文书
中学教师师德承诺书
2014/05/23 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
详解JVM系列之内存模型
2021/06/10 Javascript
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python