深入浅析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实现斐波那契(Fibonacci)函数
Mar 25 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 Python
python和Appium的移动端多设备自动化测试框架
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
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python使用OpenCV进行标定
2018/05/08 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python中get和post有什么区别
2020/06/19 Python
virtualenv介绍及简明教程
2020/06/23 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
解释一下钝化(Swap out)
2016/12/26 面试题
初一英语教学反思
2014/01/11 职场文书
博士生导师推荐信
2014/07/08 职场文书
英语课外活动总结
2014/08/27 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
师德承诺书
2015/01/20 职场文书
社区端午节活动总结
2015/02/11 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
天河观后感
2015/06/11 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
高一化学教学反思
2016/02/22 职场文书
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS