• 深浅拷贝


    #浅拷贝(复制一份,就相当于抄一遍)

    list1 = ['赤,橙,黄,绿,青,蓝,紫']
    list2 = list1[:] #切片会产生一个新的列表
    list3 = list1.copy() #浅拷贝
    print(id(list1))
    print(id(list2))
    print(id(list3))

    结果内存地址都不一样:
    内存地址 3276933495680
    内存地址 3276963987136 
    内存地址 3276963986880
    浅拷贝如图示范:
    1 list1 数据为列表 [赤,橙,黄,绿,青,蓝,紫 ] 内存地址为1a1b list1指针指向内存地址1a1b list1的数据改变不会影响到list2
    2 list2 执行切片 或者 copy的时候,会产生一个新的列表 内存地址为2a2b list2指针指向2a2b

     注意浅拷贝的另外一种情况:  list1的数据改变为什么会影响到list2 ?  浅拷贝不是说只是复制一份吗? 在浅拷贝后;追加的list3.append('蓝') 为什么list2还是会有"蓝"? 看图解释

    list1 = ['赤','橙','黄',['青']]
    list2 = list1.copy()
    list1[3].append("蓝")
    print(list1) ['赤', '橙', '黄', ['青', '蓝']]
    print(list2) ['赤', '橙', '黄', ['青', '蓝']]

    从图中可以看出来,['青'] 在嵌套列表中还是一个内存地址,当list2浅拷贝list1的内容适合,实际是['赤','橙','黄',内存地址3a3b],
    当list1进行list1[3].append("蓝")的时候,实际是修改的这个3a3b内存地址内容,list2读3a3b内存地址发现是指向的['青','蓝'],所以内容也会改变.

     

     

    
    

     验证内存地址一样

    print(id(list1[3])) 
    print(id(list2[3]))
    
    

     

    深拷贝 

    1 #深拷贝需要使用copy模块

    import copy
    list1 = ['赤','橙','黄',['青']]
    list2 = copy.deepcopy(list1) #深拷贝,简单来说就是全部复制一份
    list1[3].append("蓝")
    print(id(list1[3])) 内存地址跟list2[3]不一样
    print(id(list2[3])) 内存地址跟list1[3]不一样

    print(list1[3])
    print(list2[3])

       如图示:深浅拷贝最大的区别在['青']这个对象,如果是浅拷贝list1 和 list2 列表中的 ['青']对象内存地址是同一个,如果是深拷贝, ['青']对象内存地址在深拷贝的时候,会重新拷贝一份新的产生一个新的内存地址,list1 和list2 2个数据从此再无关联 

      深拷贝,就类似于,我要制作一个孙悟空,我连孙悟空的师傅师弟全部做一份新的,  浅拷贝;我新制作一个孙悟空,但是师傅师弟还是用同一份

     

     总结:

      赋值操作,没有创建对象

      浅拷贝,只拷贝第一层  使用切片[:] or copy() 做浅拷贝操作

        深拷贝,把这个对象内容以及内部的所有内容全部拷贝一遍,使用copy模块

     

    
    
     
  • 相关阅读:
    C#中|(位或)和||(逻辑或)
    VS快捷键(转)
    C# 3.0 新特性 学习(二):匿名类型、扩展方法
    Highcharts 如何添加基准线
    怎样用Diskpart进行分区
    命名空间别名限定符 (::)
    NDK下 将Platinum SDK 编译成so库 (android upnp)
    在native线程利用JNI 反射自定义类
    GithubClient(ANDROID)开源之旅(一) 初探GitHub
    基于Platinum库的DMR实现(android)
  • 原文地址:https://www.cnblogs.com/ajaxa/p/12096610.html
Copyright © 2020-2023  润新知