在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深拷贝和浅拷贝相关推荐

  1. Python基础教程,Python神仙级入门教程(非常详细)

    Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...

  2. 编程入门书籍-Python基础教程(第3版)

    Python基础教程(第3版) Magnus Lie Hetland 著,袁国忠 译 ISBN:9787115474889 包装:平装 开本:16开 正文语种:中文 出版社:人民邮电出版社 出版时间: ...

  3. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入&q ...

  4. python基础教程博客_python基础教程(一)

    之所以选择py交易有以下几点:1.python是胶水语言(跨平台),2.python无所不能(除了底层),3.python编写方便(notepad++等文本编辑器就能搞事情),4.渗透方面很多脚本都是 ...

  5. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  6. python基础教程第二版答案-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

  7. python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...

    下载地址1:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 <python基础教程第三版>高清版 ...

  8. python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...

    Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...

  9. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  10. python基础教程第二版和第三版有什么区别-《Python基础教程》(第2版修订版)中要注意的地方...

    想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势. 正是在这样的大背景下,我最近用这本<Pyth ...

最新文章

  1. 高分辨率、实时的手持物体360°三维模型重建结构光技术
  2. eclipse中配置SVN
  3. python工具是什么-python有什么好用的持续集成工具么?
  4. 99%创业会失败 去中心化是良药么?
  5. Java多线程之捕获异常
  6. 打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 补课
  7. 最近一段时间网上有一些报道称35岁以后只有两种人可以幸福的老去
  8. 目标检测——感受野的学习笔记
  9. 为什么程序要从0开始计数
  10. growup怎么读_growup..是什么意思
  11. 三菱FX系列PLC-编程2
  12. java text类型转换_java语言实现Text格式转换成pdf文件
  13. windows电脑记事本怎么自由排序?
  14. C语言普通字体转换花体 英文网名神器
  15. SDUT程序设计基础(一)往年期末考试题目题解(2018年)
  16. vc编程的ime输入法菜单开发
  17. Trojan Killer(木马查杀工具)官方版
  18. 深度半监督学习方法总结
  19. 关于FileSystemWatcher类
  20. 自动控制原理专业词汇中英文对照(三)

热门文章

  1. qmake, makefile, make是什么东东,makefile简介!
  2. Silverlight C# 游戏开发:L2 自定义模型导入
  3. Linux网络安装(PXE + DHCP+TFTP+ Kickstart+ FTP)
  4. 《Haskell函数式编程入门》——导读
  5. Fail2ban初识
  6. OpenJudge/Poj 1163 The Triangle
  7. 提高你的Java代码质量吧:少用静态导入
  8. 【转】SAP S4HANA Cloud被IDC评为全球SaaS和云ERP系统领导者
  9. vl02n 批次拆分
  10. 结转本年利润的有关分录