zoukankan      html  css  js  c++  java
  • copy模块中的copy与deepcopy的区别

    前言

      每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~

      如果要了解copy与deepcopy的区别,就需要了解Python的存储机制;Python在赋值会在内存里开辟一个空间来存放值这就叫“内存地址”,同时会开辟一个空间来存放名字叫命名,在数据相同长度在一定范围、且数据为不可变类型时,Python的内部会有节省内存机制让几个变量名指向同一个内存地址,当然这个就不存在什么深浅拷贝了hhh~,来说说可变类型吧,一般浅拷贝是对最外层的数据进行拷贝,也就是开辟一个新的内存空间来存储,而对内层的数据进行内存地址的引用,而深拷贝则是将原数据所有数据重新存储到一个新的内存空间中。反正记住一点,在多个变量引用同一个内存地址的可变数据时,无论是对哪个变量进行修改,其余的值也会随之变化。

    浅拷贝

    无论多复杂的数据都只复制最外层的数据,对内层数据对象的内存地址进行引用。

    import copy
    list1 = ['我是第一层', ["我是第二层", ["我是第三层", ]]]
    list2 = copy.copy(list1)
    # 查看内存地址是否相同
    print(id(list1), id(list2)) # 39613704 39613768
    # 这时你发现哇,内存地址不一样是不是代表着这两个数据就完全没关系了,那我们修改其中一个试试
    list1.append("改改数据")
    print(list1) # ['我是第一层', ['我是第二层', ['我是第三层']], '改改数据']
    print(list2) # ['我是第一层', ['我是第二层', ['我是第三层']]]
    # 你会发现还是不同,我们想想前言说的,浅拷贝是对最外层的数据创建一个新的内存空间来存储,而对内层的内存地址进行引用
    list1[1].append("改改数据")
    print(list1) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据'], '改改数据']
    print(list2) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据']]
    # 果然,在修改list1第二层数据的时候,list2也随之改变了,由此可以验证我们说的是正确的

    深拷贝

    完全复制原来变量的所有数据,在内存中开辟一个新的内存地址。
    .....我就不写例子了
    list2 = copy.deepcopy(list1)
    list1无论如何修改,对list2都无法照成任何影响
  • 相关阅读:
    生产者消费者代码
    C++内存深入理解
    树、森林与二叉树的相互转换
    待卿长发及腰,我必凯旋回朝
    同一进程下的线程可以共享
    操作系统知识
    进程间通信方式
    从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”(转)

    AVL Tree 操作
  • 原文地址:https://www.cnblogs.com/Dream-huang/p/9285622.html
Copyright © 2011-2022 走看看