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

  • 相关阅读:
    Java IO编程中的几个概念
    java强转与继承关系的加深理解:object[]的数组无法强转为String[]的数组
    java反射机制获取对象中父类属性对象
    intealij idea中报错:Error during artifact deployment. See server log for details
    自定义数据属性
    字符集属性
    HTMLDocument的变化
    动态添加对象子对象,防止命名冲突
    焦点管理
    HTML5与相关类的扩充
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11592708.html
Copyright © 2020-2023  润新知