深入浅析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 正则式使用心得
May 07 Python
从零学python系列之数据处理编程实例(一)
May 22 Python
Python3遍历目录树实现方法
May 22 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
PyQt5实现简单数据标注工具
Mar 18 Python
pycharm创建一个python包方法图解
Apr 10 Python
python支付宝支付示例详解
Aug 22 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
Python3读写ini配置文件的示例
Nov 06 Python
运行python提示no module named sklearn的解决方法
Nov 29 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
PHP学习资料汇总与网址
2007/03/16 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP的PDO连接讲解
2019/01/24 PHP
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
Python AES加密模块用法分析
2017/05/22 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python基于win32api实现键盘输入
2020/12/09 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
精通CAD能手自荐书
2014/01/31 职场文书
医院保洁服务方案
2014/06/11 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书