深入浅析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 24 Python
Python正则表达式常用函数总结
Jun 24 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python编写微信公众号首图思路详解
Dec 13 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Python-for循环的内部机制
Jun 12 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
Python pygame实现中国象棋单机版源码
Jun 20 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
多文件上载系统完整版
2006/10/09 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
用console.table()调试javascript
2014/09/04 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
详解python中的 is 操作符
2017/12/26 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Django 外键的使用方法详解
2019/07/19 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
五一服装活动方案
2014/01/11 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
开工仪式策划方案
2014/05/23 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS