zoukankan      html  css  js  c++  java
  • Python 列表深浅复制详解

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

  • 相关阅读:
    深度学习笔记(21)- 深度看图
    Mysql数据库主键,外键,索引概述
    软件架构的演进:单体、垂直、SOA、微服务
    2018年阿里巴巴关于Java重要开源项目汇总
    全面了解HTTP和HTTPS
    创业互联网公司如何搭建自己的技术架构
    Dubbo与Spring Cloud的比较
    Java工程师技能点梳理
    使用SpringCloud将单体迁移至微服务
    Springmvc与Struts区别?
  • 原文地址:https://www.cnblogs.com/blaomao/p/7239203.html
Copyright © 2011-2022 走看看