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

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

    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模块

     

    
    
     
  • 相关阅读:
    Leetcode 191.位1的个数 By Python
    反向传播的推导
    Leetcode 268.缺失数字 By Python
    Leetcode 326.3的幂 By Python
    Leetcode 28.实现strStr() By Python
    Leetcode 7.反转整数 By Python
    Leetcode 125.验证回文串 By Python
    Leetcode 1.两数之和 By Python
    Hdoj 1008.Elevator 题解
    TZOJ 车辆拥挤相互往里走
  • 原文地址:https://www.cnblogs.com/ajaxa/p/12096610.html
Copyright © 2011-2022 走看看