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) 深拷贝,父对象跟子对象全部创建新的地址空间,父对象跟子对象任何元素改变都互不影响;

  • 相关阅读:
    BZOJ4975: [Lydsy1708月赛]区间翻转( 博弈&逆序对)
    BZOJ4550: 小奇的博弈(NIMK博弈& 组合数& DP)
    BZOJ5301: [Cqoi2018]异或序列(莫队)
    BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
    BZOJ5125: [Lydsy1712月赛]小Q的书架(DP决策单调性)
    codevs 2495 水叮当的舞步
    bzoj 1086: [SCOI2005]王室联邦
    bzoj 3720: Gty的妹子树
    bzoj 1024: [SCOI2009]生日快乐
    bzoj 1085: [SCOI2005]骑士精神
  • 原文地址:https://www.cnblogs.com/lypy/p/3486703.html
Copyright © 2011-2022 走看看