一、深浅拷贝

如果希望将列表复制一份,通过列表的内置方法copy就可以实现:

 s = [[1,2],3,4]
s1 = s.copy()
print(s)
print(s1)

拷贝出的列表s1与原列表s完全一致。

[[1, 2], 3, 4]
[[1, 2], 3, 4]

对s1修改:

 s = [[1,2],3,4]
s1 = s.copy()
s1[1] = 'oliver'
s1[0][1] = 'hello'
print('列表s:',s)
print('列表s1:',s1)

输出:把列表s1中的元素修改为'oliver'后,原列表并未受影响。

  将s1中第一个元素[1,2]中的2修改为'hello'时,原列表中也跟着变了。

列表s: [[1, 'hello'], 3, 4]
列表s1: [[1, 'hello'], 'oliver', 4]

问题来了,通过copy方法拷贝列表s得到列表s1,修改s1中的元素后,s中的元素有的没变,有的跟着变了。为什么会出现这种现象?s与s1之间有什么联系呢?二者的内存空间是否完全独立?

如下图所示,使用列表内置的copy方法,是将新列表中的元素指向了与原列表相同的内存空间。但是,如果列表中嵌套了列表,拷贝后的列表中嵌套的列表元素指针,指向原列表中嵌套列表的整体地址,而不是指向嵌套列表中元素的内存地址。

由此可得,s1[0][1]修改后,s列表中的该元素指针指向的内存空间也会发生改变。

这便是列表的浅拷贝。

如果希望拷贝后的列表拥有完全独立的内存空间,则需要一个新的方法深拷贝来实现:

 import  copy
s = [[1,2],3,4]
s2 = copy.deepcopy(s)
s2[0][1] = 'abc'
print('列表s:',s)
print('列表s2:',s2)

使用copy.deepcopy()方法来拷贝列表,修改嵌套列表中的元素,原列表不受影响。

列表s: [[1, 2], 3, 4]
列表s2: [[1, 'abc'], 3, 4]

总结

1、浅拷贝只能拷贝最外层,修改内层则原列表和新列表都会变化。

2、深拷贝是指将原列表完全克隆一份新的。

Python——列表深浅拷贝的更多相关文章

  1. Python原理 -- 深浅拷贝

    python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...

  2. Python的深浅拷贝

    Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...

  3. Python学习-列表深浅拷贝

    一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...

  4. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  5. Python入门-深浅拷贝

    首先我们在这里先补充一下基础数据类型的一些知识: 一.循环删除 1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题: 有这样一个列表: lst = ['周杰伦','周润 ...

  6. 简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  7. python 赋值 深浅拷贝

    深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...

  8. Python随笔---深浅拷贝

    Python中为了避免某些方法的副作用(拷贝后有时更改原有数据),故存在有深浅拷贝的存在 浅拷贝导入copy方法集,使用copy_copy的方法进行 深拷贝一样导入copy方法集,使用copy_dee ...

  9. python的深浅拷贝-成为马老师的弟子

    参考链接 骏马金龙 前提 想要了解深浅拷贝之前必须要知道可变和不可变类型,和他们的特性 不可变类型 数字 字符串 元组 不可变集合 特性:改变值,会创建新的内存空间存储数据 可变类型 列表 字典 可变 ...

随机推荐

  1. Linux rcp命令详解

    Linux rcp命令 Linux rcp命令用于复制远程文件或目录. rcp指令用在远端复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件 ...

  2. 基于tensorflow的MNIST手写识别

    这个例子,是学习tensorflow的人员通常会用到的,也是基本的学习曲线中的一环.我也是! 这个例子很简单,这里,就是简单的说下,不同的tensorflow版本,相关的接口函数,可能会有不一样哟.在 ...

  3. org.apache.ibatis.binding.BindingException: Invalid bound statement

    idea中出现了这个问题 我的解决方案是: 把mapper映射文件放到资源目录下 然后就行了. 当然,这个具体原因就是:mapper.xml和接口对不上引起的,具体问题还要具体解决 协助博客:http ...

  4. servet概述

    1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...

  5. Ubuntu 14.04 下安装 MongoDB 服务器 和 PHP MongoDB Driver 数据驱动

    https://laravel-china.org/topics/309/install-mongodb-server-and-php-mongodb-driver-data-driver-under ...

  6. workerman 简单笔记

    运行命令 curl -Ss http://www.workerman.net/check.php | php     都显示的ok (注意:检测脚本中没有检测event扩展或者libevent扩展) ...

  7. MSSQL 2012 密钥

    MICROSOFT SQL SERVER 2012 企业核心版激活码序列号: FH666-Y346V-7XFQ3-V69JM-RHW28 MICROSOFT SQL SERVER 2012 商业智能版 ...

  8. svn项目清除svn链接信息

    如果copy的项目原来有svn连接信息,测试新技术新方案时可能会有隐患,不小心上传svn很造成很多麻烦. 这时先删除svn连接是比较好的选择. 删除svn的方法是删除项目根目录下的.svn文件夹.这个 ...

  9. 【mysql】MySQL知识整理-死锁分析-性能优化等

    [[TOC]] 常用操作指令 show databases:显示所有的数据库: use dbName: 使用指定数据库 show tables: 显示所有的数据表: desc tableName: 查 ...

  10. Hadoop 管理工具HUE配置-filebrowser配置

    Hue提供了图形化截面管理HDFS数据,可谓之非常方便,但是在配置上,还是有点麻烦的. 1 /home/hadoop/software/cloud/hue/desktop/conf/pseudo-di ...