zoukankan      html  css  js  c++  java
  • python全栈闯关--7-3、深浅copy

    1、引子

    l1 = [1, 2, 3]
    l2 = l1
    l1.append('a')
    print(l2)

    可变数据类型,赋值复制后,更改其中一个,另一个将会发生改变。

    为解决这一问题,需要对数据执行深浅copy

    2、浅copy

    l1 = [1, 2, 3]
    l2 = l1.copy()
    l1.append('a')
    print(l1)
    print(l2)

    使用copy方法,实现了列表的复制,但是对孙子辈,重孙辈无效

    # copy方法可以保证第一层的数据添加后不变
    # 但是第二层数据添加,同样影响到copy后的列表
    l1 = [1, 2, [4, 5, 6], 3]
    l2 = l1.copy()
    l1.append('a')
    print(id(l1), id(l2))
    print(l1, l2)
    l1[2].append('第二层')
    print(id(l1), id(l2))
    print(l1, l2)  # [1, 2, [4, 5, 6, '第二层'], 3, 'a'] [1, 2, [4, 5, 6, '第二层'], 3]
    print(id(l1[2]), id(l2[2]))  # 3015533617800 3015533617800

    从以上命令,可以看出,第二层依然指向相同的内存

    3、深copy

    import copy
    l1 = [1, 2, [4, 5, 6,[12,3,4]], 3]
    l2 = copy.deepcopy(l1)
    
    print("第一层添加值")
    l1.append('a')
    print(id(l1), id(l2))
    print(l1, l2)
    print('第二层添加值')
    l1[2].append('第二层')
    print(id(l1), id(l2))
    print(l1, l2)  # [1, 2, [4, 5, 6, [12, 3, 4], '第二层'], 3, 'a'] [1, 2, [4, 5, 6, [12, 3, 4]], 3]
    print(id(l1[2]), id(l2[2]))  # 3015535702088 3015535594056
    
    l1[2][3].append('第三层')
    print(id(l1[2][3]), id(l2[2][3]))  # 3015535842120 3015535842440
    print(l1,l2)  # [1, 2, [4, 5, 6, [12, 3, 4, '第三层'], '第二层'], 3, 'a'] [1, 2, [4, 5, 6, [12, 3, 4]], 3]

    深copy后,列表所有的层级都分配独立的内存,不在共享

  • 相关阅读:
    分布式文档存储数据库 MongoDB
    MongoDB运行状态、性能监控,分析
    Mongodb在Linux下的安装和启动和配置
    mongodb 状态监控命令详解
    Asp.net Core 入门实战 2.请求流程
    Asp.net Core 入门实战
    前后端分离之CORS和WebApi
    2.CLI标准
    JavaScript的引入方式
    CSS选择器的优先级
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11592708.html
Copyright © 2011-2022 走看看