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))

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

  • 相关阅读:
    防止SSH自动断线
    php intval()和floatval()
    开启 intel vt-d
    前用户sudo免密码
    分区工具parted的详解及常用分区使用方法
    Proxmox qm命令应用实例
    Mac上制作Centos7系统U盘安装盘
    FinalShell Mac OS版,Linux版安装及教程
    python爬虫彩票案例,并自动发微信
    Python利用itchat库向好友或者公众号发消息
  • 原文地址:https://www.cnblogs.com/1oo88/p/11417390.html
Copyright © 2011-2022 走看看