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

    深浅拷贝

    浅拷贝

    l1 = [1, 2, 3, [4, 5, 6]]
    print(l1)
    print(id(l1))
    print(l1[3])
    print(id(l1[3]))
    #l2是通过l1浅拷贝而来的
    l2 = l1.copy()
    l1[3][0] = 444
    print(l2)
    print(id(l2))
    print(l2[3])
    print(id(l2[3]))
    #最后打印在打印l1的内容,发现该列表中的值随着l2的改变也改变了
    print(l1)
    print(id(l1))
    #输出结果为
    [1, 2, 3, [4, 5, 6]]
    2799837795400
    [4, 5, 6]
    2799837794888
    [1, 2, 3, [444, 5, 6]]
    2799838353416
    [444, 5, 6]
    2799837794888
    [1, 2, 3, [444, 5, 6]]
    2799837795400
    #可以看出在浅拷贝中一个列表中的嵌套列表的值改变之后,另一个列表会相应的改变!因为它们嵌套的列表使用的是同一内存地址
    

    深拷贝

    在编写深拷贝程序时要用到deepcopy函数,但是需要引入copy模块!

    1、浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
    2、经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了

    #导入copy库
    import copy
    l1 = [1, 2, 3, [4, 5, 6]]
    print(l1)
    print(id(l1))
    print(l1[3])
    print(id(l1[3]))
    #l2是通过l1深拷贝而来的
    l2 = copy.deepcopy(l1)
    l2[3][0] = 444
    print(l2)
    print(id(l2))
    print(l2[3])
    print(id(l2[3]))
    #最后打印在打印l1的内容,发现该列表中的值并没有变化
    print(l1)
    print(id(l1))
    #输出的结果为
    [1, 2, 3, [4, 5, 6]]
    2418495986184
    [4, 5, 6]
    2418495986248
    [1, 2, 3, [444, 5, 6]]
    2418495986504
    [444, 5, 6]
    2418464576776
    [1, 2, 3, [4, 5, 6]]
    2418495986184
    #可以看出深拷贝和浅拷贝不一样之处在于对于嵌套的引用部分会独自分配内存!
    
  • 相关阅读:
    php安装扩展的几种方法
    navicat连接linux系统中mysql-错误:10038
    linux下报错bash: service: command not found
    linux配置防火墙和重启防火墙
    linux 环境安装
    匿名函数
    workman的学习总结
    xampp/apache启动失败解决方法
    Linux 查看IP
    慢查询日志
  • 原文地址:https://www.cnblogs.com/a736659557/p/11892333.html
Copyright © 2011-2022 走看看