Python基础教程:list深拷贝和浅拷贝
在Python中,经常要对一个list进行复制。对于复制,自然的就有深拷贝与浅拷贝问题。深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这两个list在内存中是否储存在同一个区域,这也是区分深拷贝与浅拷贝的重要依据。接下来我们就针对Python中list复制的几种方法,来探究一下其是属于深拷贝还是浅拷贝。弄清楚这个问题,有助于我们在编程中规避错误,减少不必要的调试时间。
一、非拷贝方法——直接赋值
如果用=直接赋值,是非拷贝方法。这两个列表是等价的,修改其中任何一个列表都会影响到另一个列表。这也是Python作为动态语言与C这类静态语言在思想上的不同之处。
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)
运行结果如下:
二、浅拷贝的几种方法
1.copy()方法
我们来看以下代码:
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)
运行结果如下:
对于list的第一层,是实现了深拷贝,但对于嵌套的list,仍然是浅拷贝。这其实很好理解,内层的list保存的是地址,复制过去的时候是把地址复制过去了。嵌套的list在内存中指向的还是同一个。
2.使用列表生成式
使用列表生成式产生新列表也是一个浅拷贝方法,只对第一层实现深拷贝。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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)
运行结果如下:
3.用for循环遍历
通过for循环遍历,将元素一个个添加到新列表中。这也是一个浅拷贝方法,只对第一层实现深拷贝。
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)
运行结果如下:
4.使用切片
通过使用[:]切片,可以浅拷贝整个列表。同样的,只对第一层实现深拷贝。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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)
运行结果如下:
三、深拷贝的实现
如果用deepcopy()方法,则无论多少层,无论怎样的形式,得到的新列表都是和原来无关的,这是最安全最清爽最有效的方法。
使用时,要导入copy。
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基础教程,Python神仙级入门教程(非常详细)
Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...
- 编程入门书籍-Python基础教程(第3版)
Python基础教程(第3版) Magnus Lie Hetland 著,袁国忠 译 ISBN:9787115474889 包装:平装 开本:16开 正文语种:中文 出版社:人民邮电出版社 出版时间: ...
- Python基础教程学习笔记:第一章 基础知识
Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入&q ...
- python基础教程博客_python基础教程(一)
之所以选择py交易有以下几点:1.python是胶水语言(跨平台),2.python无所不能(除了底层),3.python编写方便(notepad++等文本编辑器就能搞事情),4.渗透方面很多脚本都是 ...
- python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...
python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...
- python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...
想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...
- python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...
下载地址1:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 <python基础教程第三版>高清版 ...
- python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...
Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...
- python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...
python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...
- python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...
想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...
最新文章
- 高分辨率、实时的手持物体360°三维模型重建结构光技术
- eclipse中配置SVN
- python工具是什么-python有什么好用的持续集成工具么?
- 99%创业会失败 去中心化是良药么?
- Java多线程之捕获异常
- 打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 补课
- 最近一段时间网上有一些报道称35岁以后只有两种人可以幸福的老去
- 目标检测——感受野的学习笔记
- 为什么程序要从0开始计数
- growup怎么读_growup..是什么意思
- 三菱FX系列PLC-编程2
- java text类型转换_java语言实现Text格式转换成pdf文件
- windows电脑记事本怎么自由排序?
- C语言普通字体转换花体 英文网名神器
- SDUT程序设计基础(一)往年期末考试题目题解(2018年)
- vc编程的ime输入法菜单开发
- Trojan Killer(木马查杀工具)官方版
- 深度半监督学习方法总结
- 关于FileSystemWatcher类
- 自动控制原理专业词汇中英文对照(三)
热门文章
- qmake, makefile, make是什么东东,makefile简介!
- Silverlight C# 游戏开发:L2 自定义模型导入
- Linux网络安装(PXE + DHCP+TFTP+ Kickstart+ FTP)
- 《Haskell函数式编程入门》——导读
- Fail2ban初识
- OpenJudge/Poj 1163 The Triangle
- 提高你的Java代码质量吧:少用静态导入
- 【转】SAP S4HANA Cloud被IDC评为全球SaaS和云ERP系统领导者
- vl02n 批次拆分
- 结转本年利润的有关分录