zoukankan      html  css  js  c++  java
  • python 深浅拷贝

    浅拷贝

    l1 = [1, 'a', [4, 5, 6]]
    print(l1)   #[1, 'a', [4, 5, 6]]
    print(id(l1))   #163373256
    print(id(l1[0]))    #1622830560
    l2 = l1.copy()  # [1, 'a', [4, 5, 6]]
    l2[2][0] = 4444
    print(l2)       #[1, 'a', [4444, 5, 6]]
    print(id(l2))   #163375624
    print(id(l2[0]))    #1622830560
    print("l1:", l1)    #l1: [1, 'a', [4444, 5, 6]]
    print("id_l1:", id(l1)) #id_l1: 163373256

    原理: 手绘!

      因为浅拷贝,只是创建了新的内存地址,简单拷贝了原列表第一层所有元素指向的地址。 所以两个列表内元素指向的是都是相同id。

      其中第三个元素[4, 5, 6]是可变类型,指向一个4,5,6三个元素集合的地址。若其中元素变化,不影响第三个元素[4, 5, 6]的id。l1和l2第三个元素依然指向相同的id。

      所以当l1中列表元素发生变化,l2中列表同样发生变化

    深拷贝

    import copy
    l1 = [1, 'a', [4, 5, 6]]
    print(l1)   #[1, 'a', [4, 5, 6]]
    print('id(l1[0]):',id(l1[0]))    #1622830560
    print('id(l1[2]):',id(l1[2]))   #162961416
    print(id(l1))   #163373256
    # print(id(l1[0]))
    l2 = copy.deepcopy(l1)  # [1, 'a', [4, 5, 6]]
    print('id(l2[0]):',id(l2[0]))    #1622830560   不可变类型ip地址相同
    print('id(l2[2]):',id(l2[2]))   #163375432    可变类型ip地址发生变化
    l2[2][0] = 4444
    print(l2)   #[1, 'a', [4444, 5, 6]]
    print(id(l2))   #163375624
    print("l1:", l1)    #l1: [1, 'a', [4, 5, 6]]
    print("id_l1:", id(l1)) #id_l1: 163373256

     原理:

      经过测试,l1和l2的ip地址是相同的。但是其中不可变的列表元素ip地址是不同的。

      深拷贝是把可变元素完全复制,而不可变元素指向地址保持一致。节约了空间,妙啊!

  • 相关阅读:
    样本间相似度/距离的计算方法总结
    package.json字段全解
    使用Charles对Https请求进行抓包
    URI和URL的区别
    webstorm常用快捷键
    HTML中判断手机是否安装某APP,跳转或下载该应用
    Git 常用命令大全
    vue的测试(Vue.js devtool)
    js求两个数的最大公约数
    javascript实现验证身份证号的有效性并提示
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11815286.html
Copyright © 2011-2022 走看看