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

  • 相关阅读:
    mysql授权
    mysql函数大全
    mysql常用命令
    ECMAScript中变量的解构赋值
    ECMAScript中的const常量
    ECMAScript中let与var的区别
    javaScript中的变量作用域的闭包处理
    javaScript的prototype对象
    javaScript中的this作用域
    js对象的创建方式
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11592708.html
Copyright © 2011-2022 走看看