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

  • 相关阅读:
    nginx
    不再想写博客的大众集合教程
    数据结构与算法之算法
    数据结构与算法
    yii2的安装使用
    git的使用方法总结
    php生成图片验证码
    git推送失败的问题
    配置nginx支持thinkphp框架
    centos下的lnmp环境搭建
  • 原文地址:https://www.cnblogs.com/lypy/p/3486703.html
Copyright © 2020-2023  润新知