深入浅析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 实现插入排序算法
Jun 05 Python
videocapture库制作python视频高速传输程序
Dec 23 Python
Golang与python线程详解及简单实例
Apr 27 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
PyQt5实现简易电子词典
Jun 25 Python
基于python操作ES实例详解
Nov 16 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
python 用pandas实现数据透视表功能
Dec 21 Python
Pytest allure 命令行参数的使用
Apr 18 Python
python简单验证码识别的实现过程
Jun 20 Python
分享3个非常实用的 Python 模块
Mar 03 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目录导航文件代码
2006/10/09 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
最简单的js图片切换效果实现代码
2011/09/24 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
python下载库的步骤方法
2019/10/12 Python
python全局变量引用与修改过程解析
2020/01/07 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
老人节标语大全
2014/10/08 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
订货会邀请函
2015/01/31 职场文书
2016年十一促销广告语
2016/01/28 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis