• 深浅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))

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

  • 相关阅读:
    应用连接Redis报错处理
    粗谈RESTFul API接口-认识粗谈RESTFul API接口-认识
    策略模式有效解决过多的if-else
    slice的共享内存时需要注意的问题
    swoole中使用wss
    swoole版本和PHP版本的对应关系
    php中关于新引入object的坑
    Java Object Serialization Specification.
    php将索引数组转换成关联数组
    Gson解析json字符串的坑
  • 原文地址:https://www.cnblogs.com/1oo88/p/11417390.html
Copyright © 2020-2023  润新知