zoukankan      html  css  js  c++  java
  • 深浅Copy的理解

    在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。

    而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。

    而深浅拷贝有三种情况:拷贝的是不可变对象、拷贝的是可变对象、拷贝的可变对象里面还有子对象

    拷贝不可变对象

    import copy
    list0 = 'hello,world'
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    对list0()进行修改:list0 = list0 + 'good evening'

    发现即使修改了list0,其他的值也不会变,地址也没有改变。

    结论:对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。 

    拷贝可变对象

    import copy
    list0 = [1,2,3,4,5,6]
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    对于可变对象来说:

      赋值(我们暂且称它为’=浅拷贝’)的新对象与原对象相比,值相等,地址也相等;
      浅拷贝:与原对象相比,值相等,地址不相等;
      深拷贝:与原对象相比,值相等,地址不相等。

    拷贝可变对象中还存在子对象的

    import copy
    list0 = [1,2,3,4,5,6, ['a', 'b']]
    list1 = copy.copy(list0)
    list2 = copy.deepcopy(list0)
    list3 = list0
    list0[6].append('c')
    print(list0, id(list0))
    print(list1, id(list1))
    print(list2, id(list2))
    print(list3, id(list3))

    结论:浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,而深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。

  • 相关阅读:
    iOS沙盒机制
    iOS网络图片缓存SDWebImage
    iOS缓存到sandbox
    iOS缓存到内存
    网络语音技术
    iOS的影片播放 MediaPlayer 和 AVPlayer
    IOS上MediaPlayer framework实现视频播放
    线程间通信共享变量和queue
    如何进行多线程编程
    python的并发GIL 了解
  • 原文地址:https://www.cnblogs.com/1oo88/p/11417390.html
Copyright © 2011-2022 走看看