zoukankan      html  css  js  c++  java
  • 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(),就是整体变量值,赋值一份,开辟新的内存空间。属于深拷贝。对可变、不可变变量都适用,仅有可变变量有差别效果。

  • 相关阅读:
    【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例
    【Java基础】1、java中的instanceof
    【Java面试】1、基础知识篇
    【github&&git】3、git图像化界面GUI的使用
    【github&&git】2、github入门到上传本地项目
    Spring Boot属性配置文件详解
    微服务Spring Cloud与Kubernetes比较
    导入时如何定制spring-boot依赖项的版本
    spring容器ApplicationContext初始化(spring应用上下文初始化)
    spring概念简介、bean扫描与注册实现方式
  • 原文地址:https://www.cnblogs.com/andy9468/p/13022092.html
Copyright © 2011-2022 走看看