• 深拷贝浅拷贝


    概述

    拷贝只复制对象的意思,判断是深拷贝还是浅拷贝看他深层次的数据结构有没有被拷贝。

    详情

    代码

    import copy
    
    a = [1,2,3,4,5,['a','b']]     #原对象
    b = a             #赋值,传对象的引用。栈内存地址是同一个指向同一个堆内存地址
    c = copy.copy(a)    #对象浅拷贝,列表地址不变但里面具体值已经变了
    d = copy.deepcopy(a)    #对象深拷贝,列表和具体值都不会变
    
    print('a=',a,'  id(a)=',id(a),'id(a[5])=',id(a[5]))
    print('b=',b,'  id(b)=',id(b),'id(b[5])=',id(b[5]))
    print('c=',c,'  id(c)=',id(c),'id(c[5])=',id(c[5]))
    print('d=',d,'  id(d)=',id(d),'id(d[5])=',id(d[5]))
    print("*"*80)
    #变换数值地址不变
    a.append(6)
    a[5].append('c')
    print('a=',a,'  id(a)=',id(a),'id(a[5])=',id(a[5]))
    print('b=',b,'  id(b)=',id(b),'id(b[5])=',id(b[5]))
    print('c=',c,'  id(c)=',id(c),'id(c[5])=',id(c[5]))
    print('d=',d,'  id(d)=',id(d),'id(d[5])=',id(d[5]))

    一、以上代码结论得出数据结论如下

    1)赋值和被赋值对象,数据保持一致

    2)浅拷贝后的对象,如果原数据新增元素,数组元素会新增成功列表内的普通元素不会新增

    3)深拷贝后的对象,如果原数据新增元素,数组元素和普通元素都不会变动

    二、以上代码得出的id变化结论如下

    1.对象赋值:赋值和被赋值指向的堆内存地址一样

    2.浅拷贝深拷贝对列表的单个元素的内存地址是一样的如 a[4],c[4],d[4]都是同一个地址。

    3.浅拷贝对于a示例列表内嵌套列表(可以把这种看成数组,和数组还是有点区别 数组是保存的同一类型的线程数据结构二列表

    是动态的可以是非同一类型的数据结构),a被copy成c后(copy.copy(c))。c的地址改变c的内嵌列表和原对象a的内嵌列表地址一样没有变化

    4.深拷贝和3不同,深拷贝d数组的内嵌列表地址和原对象内嵌地址一样

    5.原对象、深拷贝、浅拷贝值变更后,地址不变

    参考链接:

    https://www.cnblogs.com/xiaxiaoxu/p/9742452.html

    转载引用请标明出处,本博出自喝了少不如不喝的博客https://home.cnblogs.com/u/wangdadada
  • 相关阅读:
    session的使用
    不可变对象的魅力
    协变和逆变
    LaTeX 学习小结
    KMP 算法的两种实现
    MySQL MVCC
    Java 并发之 Executor 框架
    Java 动态代理的简单使用和理解
    Java 偏向锁、轻量级锁和重量级锁
    事件循环和协程
  • 原文地址:https://www.cnblogs.com/wangdadada/p/12334513.html
Copyright © 2020-2023  润新知