深入浅析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远程登录代码
Apr 29 Python
python 布尔操作实现代码
Mar 23 Python
python使用自定义user-agent抓取网页的方法
Apr 15 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
如何理解Python中的变量
Jun 01 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python 爬取京东指定商品评论并进行情感分析
May 27 Python
python lambda 表达式形式分析
Apr 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 什么是PEAR?(第三篇)
2009/03/19 PHP
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Python 文件重命名工具代码
2009/07/26 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python set内置函数的具体使用
2019/07/02 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python打包生成so文件的实现
2020/10/30 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
印度民族服装购物网站:BIBA
2019/08/05 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
有关打架的检讨书
2014/01/25 职场文书
中专自我鉴定
2014/02/05 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
主题团日活动总结
2014/06/25 职场文书
机关作风建设心得体会
2014/10/22 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Nginx HTTP跳转至HTTPS
2022/05/15 Servers