zoukankan      html  css  js  c++  java
  • python--浅拷贝和深拷贝

    (1)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

    >>> alist=[1,2,3,["a","b"]]
    >>> import copy
    >>> c = copy.copy(alist)
    >>> print(alist)
    [1, 2, 3, ['a', 'b']]
    >>> print(c)
    [1, 2, 3, ['a', 'b']]

    >>> print(id(alist))
    1901101263176
    >>> print(id(c))
    1901101300616-----内存地址发生了改变,拷贝了外层
    >>> print(id(alist[0]))
    1946643936
    >>> print(id(c[0]))
    1946643936--------元素地址,未变
    >>> print(id(alist[1]))
    1946643968
    >>> print(id(c[1]))
    1946643968--------元素地址,未变
    >>> print(id(alist[2]))
    1946644000
    >>> print(id(c[2]))
    1946644000--------元素地址,未变
    >>> print(id(alist[3]))
    1901101263560
    >>> print(id(c[3]))
    1901101263560--------元素地址,未变
    >>> alist.append(5)
    >>> print(alist)
    [1, 2, 3, ['a', 'b'], 5]------外层地址中增加一个元素,
    >>> print(c)
    [1, 2, 3, ['a', 'b']]-------外层地址不一样,不会影响这个外层列表
    >>> alist[3]
    ['a', 'b']
    >>> alist[3].append("ccc")
    >>> print(alist)
    [1, 2, 3, ['a', 'b', 'ccc'], 5]
    >>> print(c)
    [1, 2, 3, ['a', 'b', 'ccc']]-----由于不会拷贝内层子元素地址,所以修改会跟着改变

    (2)深拷贝,包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

    >>> import copy
    >>> alist = [1,2,3,['a','b']]
    >>> d = copy.deepcopy(alist)
    >>> print(alist)
    [1, 2, 3, ['a', 'b']]
    >>> print(d)
    [1, 2, 3, ['a', 'b']]-----始终没有改变
    >>> print(id(alist))
    2257173957256
    >>> print(id(d))
    2257173978760-----生成一个新的内存地址
    >>> print(id(alist[0]))
    1946643936
    >>> print(id(d[0]))
    1946643936---------数字类型,不可变,引用同一块内存地址
    >>> print(id(alist[1]))
    1946643968
    >>> print(id(d[1]))
    1946643968---------数字类型,不可变,引用同一块内存地址
    >>> print(id(alist[2]))
    1946644000
    >>> print(id(d[2]))
    1946644000---------数字类型,不可变,引用同一块内存地址
    >>> print(id(alist[3]))
    2257173957640
    >>> print(id(d[3]))
    2257173978376-----列表类型,可变,从新生成了一个新的内存地址
    >>> alist.append(5)
    >>> print(alist)
    [1, 2, 3, ['a', 'b'], 5]
    >>> print(d)
    [1, 2, 3, ['a', 'b']]
    >>> alist[3].append('cccc')
    >>> print(alist)
    [1, 2, 3, ['a', 'b', 'cccc'], 5]
    >>> print(d)
    [1, 2, 3, ['a', 'b']]-------始终没有改变
    ---------------------------------------------------------------------------------------------------------------

    总结,浅拷贝,只拷贝最外层,生成一个新的内存地址,对最外层里面一层不可变数据类型的改变不会影响另一份拷贝数据,但是对可变数据类型,因为引用的是同一块内存地址,所用,源数据的改变会造成拷贝数据的改变

    深拷贝,不仅拷贝最外层,生成一个新的内存地址,对立面的子可变对象也拷贝,生成一个新的内存地址,所以说,深拷贝情况下,拷贝数据一直不会改变

  • 相关阅读:
    Django框架03 /视图相关
    Django框架02 /Django下载安装、url路由分发
    Django框架01 / http协议、web框架本质
    前端09 /jQuery标签操作、事件、补充
    前端08 /jQuery标签操作、事件
    前端07 /jQuery初识
    Public key for mysql....rpm is not installed
    无参数实例化Configuration对象以及addResource无法加载core-site.xml中的内容
    Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr
    MaxTemperature程序Mapper ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/xudachen/p/8552828.html
Copyright © 2011-2022 走看看