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

    概述

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

    详情

    代码

    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
  • 相关阅读:
    PS制作动感酷炫水人街舞照
    PS调出水彩画效果古装人物照片
    PS调出怀旧雨中特写的非主流照片
    PS制作墙壁上海报卷页图片效果
    PS绘制扁平化风格相机镜头UI图标
    PS调出甜美艺术外景女生照片
    PS调出冷绿色电影画面风格
    PS调出通透唯美阳光外景女生照片
    PS调出唯美冷色情侣婚纱写真照
    c#类中字段和方法中变量的声明问题
  • 原文地址:https://www.cnblogs.com/wangdadada/p/12334513.html
Copyright © 2011-2022 走看看