• python的深拷贝和浅拷贝


    1、浅拷贝

    浅拷贝:相当于引用,不开辟新空间。b = a 只是把a的地址复制给了b。

    如,赋值。

    In [2]: a = [11, 22, 33]
    In [3]: b = a
    In [4]: b
    Out[4]: [11, 22, 33]
    In [5]: id(a)
    Out[5]: 140117500009736
    In [6]: id(b)
    Out[6]: 140117500009736
    =拷贝地址相同

    2、深拷贝

    深拷贝:开辟新的内存空间。

    深拷贝又有2种:copy()和deepcopy(),都是深拷贝,深度不同。
    (1)copy()拷贝是开辟新空间(新地址),但空间里的元素不是新空间(新地址),而是引用(旧地址),引用的好处是占用内存少。简言之,copy()拷贝是对于一个对象的顶层拷贝。
    (2)deepcopy()拷贝也是开辟新空间(新地址),并且所有的元素都为全新的空间(新地址),整个全新空间的坏处就是占用内存多。简言之,deepcopy()把a的内容完整的复制了一份。

    针对可变变量,深拷贝才有不同效果,如字典、列表。

    针对不可变变量,深拷贝和浅拷贝效果是一样的,如int、long、float、tuple元组等。

    copy拷贝
    In [2]: a = [11, 22, 33]
    In [3]: import copy
    In [4]: b = copy.copy(a)
    In [5]: b
    Out[5]: [11, 22, 33]
    In [6]: id(a)
    Out[6]: 140254995326344
    In [7]: id(b)
    Out[7]: 140255016303176
    copy拷贝开辟浅层空间,但copy用于拷贝元组的时候不会开辟浅层空间,而全都是引用。
    In [8]: id(a[0])
    Out[8]: 10914688
    In [9]: id(b[0])
    Out[9]: 10914688
    copy拷贝中,元素的地址相同
    In [10]: a.append(44)
    In [11]: a
    Out[11]: [11, 22, 33, 44]
    In [12]: b
    Out[12]: [11, 22, 33]
    添加元素没有相互影响,但修改元素就会相互影响了

    deepcopy拷贝
    In [2]: a = [11, 22, 33]
    In [3]: import copy
    In [4]: b = copy.deepcopy(a)
    In [5]: b
    Out[5]: [11, 22, 33]
    In [6]: id(a)
    Out[6]: 139826159553800
    In [7]: id(b)
    Out[7]: 139826159601160
    deepcopy开辟整个的全新空间。
    添加和修改元素都没有影响。

    小结:

    =赋值操作:
    可变变量的引用会改变
    +=修改操作:
    可变变量的引用不会改变,但是值会改变。

    1、等号赋值,就是将引用给另一个变量,不开辟新的空间。属于浅拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。
    2、深拷贝copy(),就是将表层变量值,复制一份,开辟新的内存空间。属于深拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。
    3、深拷贝deepcopy(),就是整体变量值,赋值一份,开辟新的内存空间。属于深拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。

  • 相关阅读:
    移动端工作心得
    小程序初探
    你可能会用到的"奇技赢巧"
    一个知乎日报pwa
    Progressive Web Applications
    Java中的基本数据类型以及装箱、拆箱
    用sql获得指定记录的空段数目和字段名称--实在想不通,这种场景应用在哪
    putIfAbsent,一个字段为空的话,将该字段设置为指定值
    PO、VO、BO、POJO、DAO、DTO都是什么对象
    Java中字符串连接符(+)和append的区别
  • 原文地址:https://www.cnblogs.com/andy9468/p/13022092.html
Copyright © 2020-2023  润新知