Python列表深浅复制详解
转自:https://www.cnblogs.com/blaomao/p/7239203.html
在文章《Python 数据类型》里边介绍了列表的用法,其中列表有个 copy() 方法,意思是复制一个相同的列表。例如
1 names = ["小明", "小红", "小黑", "小黄", "小白"]
2 # 把 names 复制,赋值给 names2 变量
3 names2 = names.copy()
4 # 分别输出 names names2
5 print(names)
6 print(names2)
这时会发现结果是一样的,那么问题来了,我要把 names 列表中的 小黄改成英文 Yellow,那么 names2 的小黄会发生变化吗?写一段代码看看

1 names = ["小明", "小红", "小黑", "小黄", "小白"]
2 # 把 names 复制,赋值给 names 变量
3 names2 = names.copy()
4 # 修改 names 列表中的 小黄
5 names[3] = "Yellow"
6 # 分别输出 names names2
7 print(names)
8 print(names2)

看结果会发现,只是把names 列表中的 小黄 改成了 Yellow ,names2 列表中没有变,其实它的原理很简单,如下图
首先,names 指向一个列表,然后把 names 复制了一份,赋值给 names2 ,由于 修改的是 第一个 列表的 小黄,所以第二个列表不受影响。
那么现在我改一下这个列表,从names列表中再添加一个列表,如下代码

1 names = ["小明", "小红", ["张三", "李四", "王五"], "小黑", "小黄", "小白"]
2 # 复制一份列表
3 names2 = names.copy()
4 # 把李四 改成英文
5 names[2][1] = "Lisi"
6 print(names) 7 print(names2)

这段代码的运行结果是,两个列表的李四都变成了英文,来分析一下原理
其实这个图也挺简单的,就是中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的names2 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。
也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。
补充:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用
实现浅复制的三种方法

1 import copy
2
3 names = ["小明", "小红", "小黑", "小黄", "小白"]
4 # 浅copy 1.
5 names1 = copy.copy(names)
6 # 2.
7 names2 = names[:]
8 # 3. 工厂函数
9 names3 = list(names)

深复制的方法

1 import copy
2
3 names = ["小明", "小红", "小黑", ["粉色"], "小黄", "小白"]
4 # 深复制
5 deep_names = copy.deepcopy(names)
6 # 修改粉色为 Pink
7 names[3][0] = "Pink"
8 # 分别打印输出两个列表
9 print(names)
10 print(deep_names)

输出结果为:
['小明', '小红', '小黑', ['Pink'], '小黄', '小白'] ['小明', '小红', '小黑', ['粉色'], '小黄', '小白']
Python列表深浅复制详解的更多相关文章
- Python 列表深浅复制详解
在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法,意思是复制一个相同的列表.例如 names = ["小明", "小红& ...
- Python的深浅copy详解
Python的深浅copy详解 目录 Python的深浅copy详解 一.浅copy的原理 1.1 浅copy的定义 1.2 浅copy的方法 二.深copy的原理 2.1 深copy的定义 2.2 ...
- Python 列表(List)操作方法详解
Python 列表(List)操作方法详解 这篇文章主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下 列表是Python中最基本 ...
- python 列表、元组 详解
python中有6种序列的内置类型,分别为:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象 列表和元组是最常见两种类型. 下面将以列表(list)和元组(tuple)为例 ...
- python列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- Python编程之列表操作实例详解【创建、使用、更新、删除】
Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...
- Python基础之列表深浅复制和列表推导式
一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...
- Python数据类型及其方法详解
Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...
随机推荐
- SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
SAP Cloud for Customer(C4C)和SAP其他传统产品进行数据同步的方式,如下图所示,可以使用SAP Netweaver Process Integration或者SAP HANA ...
- linux 下svn同步更新钩子
svn服务器搭建:https://www.linuxidc.com/Linux/2017-05/144254.htm SVN版本库中的一个项目:/svn/repositories/test/ 网站目录 ...
- react里面引入图片
引入图片确实走了很多的坑,开始的认知里,所有静态页面都需要放在public里面能执行,代码是这样的 css .back{ background-image: url('/images/homeBack ...
- spring boot学习1
转:https://blog.csdn.net/jsyxcjw/article/details/46763639 1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于 ...
- C# 使用布尔操作符
布尔操作符(Boolean operator)是求值结果要么为true,要么为false的一种操作符.C#提供了几个非常有用的布尔操作符,其中最简单的是NOT(求反)操作符,它使用感叹号(!)来表示. ...
- JS isArray、typeof、instanceof
Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...
- 用struct LNode *L与LinkList &L的区别
用void InitList(struct LNode *L), 函数InitList中如果改变了L指针本身的值,对其他函数无影响.用void InitList(LinkList &L),函数 ...
- Windows平台下源码分析工具
最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...
- linux 安装 zookeeper
第一步 下载 zookeeper: http://archive.apache.org/dist/zookeeper/ 第二步 解压: tar -xzvf zookeeper-3.4.5.tar.gz ...
- linux 源码安装php7.0 yum
PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...