Python 列表复制
Python 列表复制
关于Python 列表的复制,有多种方法,常用的 有 赋值、切片、list、copy,copy.deepcopy等。
但是 实际用时 又有区别,不小心可能就用错了。
接下来 简单举例 说明一下 使用
- import copy
- a = [1,2,3,4]
- b = a
- c = a[:]
- d = a.copy()
- e = copy.copy(a)
- f = copy.deepcopy(a)
- g = list(a)
- print('id(a):%d,id(b):%d' % (id(a),id(b)))print('id(c):%d' % (id(c)))
- print('a:%s,b:%s,c%s'%(a,b,c))
- a[2] = 5
- del a[3]
- print('a:%s,b:%s,c%s'%(a,b,c))
- print('id(d):%d' % (id(d)))
- print('d:%s' % d)
- print('id(e):%d' % (id(e)))
- print('e:%s' % e)
- print('id(f):%d' % (id(f)))
- print('f:%s' % f)
- print('id(g):%d' % (id(g)))
- print('g:%s' % g)
执行 结果如下
- id(a):4409071368,id(b):4409071368
- id(c):4409070344
- a:[1, 2, 3, 4],b:[1, 2, 3, 4],c[1, 2, 3, 4]
- a:[1, 2, 5],b:[1, 2, 5],c[1, 2, 3, 4]
- # 以上可知 a、b id 一致,改变a 则 b 也会改变
- # 一下 id 则都不相同
- id(d):4408193736
- d:[1, 2, 3, 4]
- id(e):4409091336
- e:[1, 2, 3, 4]
- id(f):4409091400
- f:[1, 2, 3, 4]
- id(g):4409091080
- g:[1, 2, 3, 4]
换一种 内嵌列表的列表复制
- names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"]
- # 复制一份列表
- names2 = names.copy()
- # 把李四 改成英文
- names[2][1] = "Lisi"
- print(names)
- print(names2)
- # 执行结果
- ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']
- ['小明', '小红', ['张三', 'Lisi', '王五'], '小黑', '小黄', '小白']
这段代码的运行结果是,两个列表的李四都变成了英文,来分析一下原理
其实这个图也挺简单的,就是中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的names2 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。
也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。
补充:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用
实现浅复制的三种方法
- import copy
- names = ["小明", "小红", "小黑", "小黄", "小白"]
- # 浅copy 1.
- names1 = copy.copy(names)
- # 2.
- names2 = names[:]
- # 3. 工厂函数
- names3 = list(names)
深复制的方法
- import copy
- names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"]
- # 深复制
- deep_names = copy.deepcopy(names)
- # 修改粉色为 Pink
- names[3][0] = "Pink"
- # 分别打印输出两个列表
- print(names)
- print(deep_names)
- # 输出结果为:
- ['小明', '小红', '小黑', ['Pink'], '小黄', '小白']
- ['小明', '小红', '小黑', ['粉色'], '小黄', '小白']
如下例
- a = [[10], 20]
- b = a[:]
- c = list(a)
- d = a * 1
- e = copy.copy(a)
- f = copy.deepcopy(a)
- a.append(21)
- a[0].append(11)
- print (id(a), a)
- # 4317123656 [[10, 11], 20, 21]
- print (id(b), b)
- # 4317123592 [[10, 11], 20]
- print (id(c), c)
- # 4317123848 [[10, 11], 20]
- print (id(d), d)
- # 4317082888 [[10, 11], 20]
- print (id(e), e)
- # 4317123720 [[10, 11], 20]
- print (id(f), f)
- # 4317123784 [[10], 20]
Python 列表复制的更多相关文章
- python 列表复制给另一个列表,改值两个列表均会改变(备忘)
http://blog.csdn.net/lc_lc2000/article/details/53135839 本意是使A = B,B为一个列表,结果在后续对A的操作中,导致B中的值也改变了,才回忆起 ...
- Python 列表切片陷阱:引用、复制与深复制
Python 列表的切片和赋值操作很基础,之前也遇到过一些坑,以为自己很懂了.但今天刷 Codewars 时发现了一个更大的坑,故在此记录. Python 列表赋值:复制"值"还是 ...
- Python之复制列表
将一个列表的数据复制到另外一个列表中. 1 a = [1,2,3] #定义列表a 2 3 b = a[:] #将列表a的切片赋值给b,也可以理解为将b的值设置为a[:] 4 5 print(a) #打 ...
- Python列表、元组、字典和字符串的常用函数
Python列表.元组.字典和字符串的常用函数 一.列表方法 1.ls.extend(object) 向列表ls中插入object中的每个元素,object可以是字符串,元组和列表(字符串“abc”中 ...
- [转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...
- (转载)Python 列表(list)操作
(转载)http://blog.csdn.net/facevoid/article/details/5338048 创建列表sample_list = ['a',1,('a','b')] Python ...
- Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...
- python列表的一些常用方法以及函数
学习到了一些关于python列表的新知识,自己整理了一下,方便大家参考: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # File_type:列表的常用操 ...
- Python列表操作集合
对于python列表里元素的操作主要分为以下几个方面: 1.向列表里面加元素: 向python列表里面添加元素主要有三种方法: (1)append() append()对于列表的操作主要实现的是在特定 ...
随机推荐
- Caused by: com.rabbitmq.client.ShutdownSignalException: connection error
周五下午的时候升级了一个环境,跑了批处理sh升级脚本后,启动时报下列错误: INFO | jvm 1 | 2017/02/24 17:39:09 | java.io.IOException INFO ...
- Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定
Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...
- OSI7层模型(TCP4层)
OSI7层模型(TCP4层) 第一层:物理层 在局部局域网络上传送帧,它负责管理电脑通信设备和网络媒体之间的互通.包括了针脚.电压.线缆规范.集线器.中继器.网卡.主机适配器等. 第二层:数据链路层 ...
- (4opencv)对OpenCV中“旋转”的思考和实验
我记得曾经有人对OpenCV的旋转吐槽,意思是它自己没有很好的关于选择的算法.在新的版本里面添加了这些函数(我还没有时间去看是什么时候pr的).现在一个比较棘手的问题,就是OpenCV中旋转 ...
- 20145208 蔡野 《网络对抗》Exp9 web安全基础实践
20145208 蔡野 <网络对抗>Exp9 web安全基础实践 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验后回答问题 (1)SQL注入攻击原理,如何 ...
- linux物理网卡检测命令mii-tool
mii-tool #是用于查看.管理物理的网络接口的状态,还可以配置网卡需要的协商方式. 一 ,查看网卡工作状态 mill-tool [网卡名] #查看物理网卡连接状态 -V 显示版本信息 ...
- 学习模型-视图-控制器MVC模式
1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...
- ODAC(V9.5.15) 学习笔记(八)TOraScript
名称 类型 说明 DataSet 如果脚本中返回了数据结果,则通过该数据集进行获取 Delimiter string 脚本语句之间的分隔符 EndLine Integer 脚本中最后一行的行号 End ...
- SpringBoot 整合携程Apollo配置管理中心
携程官网对apollo的使用讲解了很多种方式的使用,但是感觉一些细节还是没讲全,特别是eureka配置中心地址的配置 这里对springboot整合apollo说一下 >SpringBoot启动 ...
- fastqc
fastqc用于查看测序数据的质量. 1.下载: http://www.bioinformatics.babraham.ac.uk/projects/download.html#fastqc wget ...