zoukankan      html  css  js  c++  java
  • Python中的浅拷贝 深拷贝

    浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种:

    1. copy

    从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列表元素同样也改变了。

    可以理解为浅拷贝只改变父对象的地址空间,而子对象的地址空间不改变,这样子对象自然会受到影响,而父对象不受影响。

    >>> a=[1,2,3,['a','b','c']]
    >>> b=a
    >>> import copy
    >>> c=copy.copy(a)
    >>> a.append(4)
    >>> b
    [1, 2, 3, ['a', 'b', 'c'], 4]
    >>> c
    [1, 2, 3, ['a', 'b', 'c']]
    >>> a[3].append('d')
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
    >>> b
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
    >>> c
    [1, 2, 3, ['a', 'b', 'c', 'd']]
    >>>

    2. list

    >>> a
    [100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> e=list(a)
    >>> e
    [100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a
    [100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a[0]=200
    >>> e
    [100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a
    [200, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a[3].remove('d')
    >>> a
    [200, 2, 3, ['a', 'b', 'c'], 4, 5]
    >>> e
    [100, 2, 3, ['a', 'b', 'c'], 4, 5]

    >>> a[3]=300
    >>> a
    [200, 2, 3, 300, 4, 5]
    >>> e
    [100, 2, 3, ['a', 'b', 'c'], 4, 5]

    3. 切片

    >>> e=a[:]
    >>> e
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> e.append(8)
    >>> e
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 8]
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> a[3].append('p')
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5]
    >>> e
    [1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5, 8]

    深拷贝父对象,子对象的地址空间都改变,这样目标对象跟原始对象无论哪个改变都不会互相影响;

    >>> d=copy.deepcopy(a)
    >>> d
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
    >>> a.append(5)
    >>> d
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> d[3].append('e')
    >>> d
    [1, 2, 3, ['a', 'b', 'c', 'd', 'e'], 4]
    >>> a
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
    >>> b
    [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]

    总结:

    e=a  相同标签引用同一个地址空间,互相影响;

    e=a[:] 或者 e=list(a) 或者 e=copy.copy(a) 均为浅拷贝,父对象互不影响,但是子对象都是引用同一个地址空间;

    e=copy.deepcopy(a) 深拷贝,父对象跟子对象全部创建新的地址空间,父对象跟子对象任何元素改变都互不影响;

  • 相关阅读:
    不懂编程,不会数据架构,同事做的可视化报表是如何让我佩服的?
    catalina.sh设置JAVA_HOME后还无法解决更换JDK有关问题
    TOMCAT数据源连接配置
    L​i​n​u​x​下​配​置​T​o​m​c​a​t
    linux下JAVA开发的环境配置
    tomcat catalina.sh JAVA_OPTS参数说明与配置
    TOMCAT-报错The BASEDIR environment variable is not defined correctly
    EBS条形码打印
    PA模块报错-实际返回的行数超出请求的行数(分析标准FORM报错解决思路)
    WIP完工入库及完工退回的几个重要问题
  • 原文地址:https://www.cnblogs.com/lypy/p/3486703.html
Copyright © 2011-2022 走看看