在文章《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'], '小黄', '小白']
['小明', '小红', '小黑', ['粉色'], '小黄', '小白']

转载于:https://www.cnblogs.com/blaomao/p/7239203.html

Python 列表深浅复制详解相关推荐

  1. python列表浅复制_Python列表深浅复制详解

    转自:https://www.cnblogs.com/blaomao/p/7239203.html 在文章<Python 数据类型>里边介绍了列表的用法,其中列表有个 copy() 方法, ...

  2. python列表拆包_详解python 拆包可迭代数据如tuple, list

    详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...

  3. Python 列表(List)操作方法详解

    列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类 ...

  4. python列表的方法详解

    列表 引题 原来学过数据类型如 a=1 b='hello' ,但是这些都变量.现实生活中我们想表达 一个班的几十个学生,一个袋子里多个水果.python当中提供了一个表达"一组"概 ...

  5. python 列表推导式详解

    推导式comprehensions(又称解析式),是Python的一种独有特性,可以从一个数据序列构建另一个新的数据序列.具有使用方便,让代码看起来很高级的功能. 分析 考虑以下需求: a=[1,2, ...

  6. #python列表语法规则详解

    列表list (*****) 定义:能装东西的东西 在python中用[]来表示一个列表.列表中的元素通过,隔开 a = ['张三丰','张无忌','张绍刚',[1,2,3,True, ]] # 嵌套 ...

  7. python 列表切片负值,详解Python 切片语法

    Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片也会让你的代码显得特别Pythonic. 切片的主要声明如下,假设现在有一个list,命名为alist: alist = [0,1 ...

  8. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新 ...

  9. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  10. 《 Python List列表全实例详解系列(三)》——列表添加元素(4种方法)

    < Python List列表全实例详解系列(三)> --列表添加元素(4种方法) 接上一篇:< Python List 列表全实例详解(二)>__访问列表元素(索引和切片)列 ...

最新文章

  1. 构建高性能的ASP.NET应用(五)-如何开始寻找性能瓶颈
  2. 在struts2中訪问servletAPI
  3. java同步锁实例_Java lock同步锁使用实例解析
  4. 一个JavaScript上的OOP编程技巧:继承
  5. Yoast SEO wordpress插件 + 所有扩展
  6. 布林通道参数用20还是26_这样设置均线参数
  7. servlet api.jar是干什么的?
  8. HDU2148 Score【序列处理】
  9. oracle 10g 学习之视图、序列、索引、同义词(9)
  10. 程序中try、throw、catch三者之间的关系
  11. Snipaste 截图工具快捷键大全
  12. 权限系统组织管理—详细设计说明书
  13. 怎么能网上赚钱?这6种方法是目前最常赚钱的方式!
  14. MySQL Audit 审计
  15. 科大讯飞语音识别SDK的ROS包修改
  16. LightOJ 1406 Assassin`s Creed
  17. css3制作菱形图片
  18. PHP+AJAX高性能聊天室(群聊+私聊)
  19. 西南科技大学 Python程序设计 班长选举
  20. IELTS writing skills——学习笔记

热门文章

  1. restController
  2. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
  3. poj1466二分图
  4. 我是怎样给 Delphi 代码着色的 - 回复 sunhj 的问题
  5. Linux设备驱动(转)
  6. Educational Codeforces Round 7
  7. 使用xftp无法连接阿里云服务器 或者linux
  8. 第4章 同步控制 Synchronization ----同步机制的摘要
  9. mysql内部代码的优缺点
  10. 重读《从菜鸟到测试架构师》--构建测试