深入浅析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自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
Jan 16 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
详解小白之KMP算法及python实现
Apr 04 Python
softmax及python实现过程解析
Sep 30 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 Python
如何用python批量调整视频声音
Dec 22 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学习之PHP表达式
2006/10/09 PHP
php下批量挂马和批量清马代码
2011/02/27 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python二分查找详解
2015/09/13 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
python实现猜单词游戏
2020/05/22 Python
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
MYSQL基础面试题
2012/05/13 面试题
团员的自我评价
2013/12/01 职场文书
丧事主持词大全
2014/04/02 职场文书
技术入股合作协议书
2014/10/07 职场文书
2014年电工工作总结
2014/11/20 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python
spring 项目实现限流方法示例
2022/07/15 Java/Android
mysql函数之截取字符串的实现
2022/08/14 MySQL