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后,列表所有的层级都分配独立的内存,不在共享

  • 相关阅读:
    LINQ大全。
    李开复回复:为什么很多人进不了Google
    判断输入的是否是数字?
    SQL Server 2005安装详解
    学习asp.net比较完整的流程
    .NET常用网站
    软件设计经典书籍推荐
    Linux 下zip包的压缩与解压
    centos的用户、组权限、添加删除用户等操作的详细操作命令
    CentOS5.5 默认基本服务详解
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11592708.html
Copyright © 2011-2022 走看看