zoukankan      html  css  js  c++  java
  • 深拷贝与浅拷贝

    • 浅拷贝

    只拷贝父对象,不会拷贝父对象中的子对象。如果该对象没有子对象的话,其浅拷贝和赋值的结果是一样的。浅拷贝可以通过导入copy模块中的copy()方法来完成,或者调用对象本身的copy()方法。例:

    import copy # 导入copy模块
    a = [1, 2, 3, ['a', 'b', 'c']]
    b = copy.copy(a)   # a.copy()
    print(id(a), id(b))
    print(a is b)
    print(a)
    print(b)
    a.append(4)
    print("-----------")
    print(id(a), id(b))
    print(a)
    print(b)
    a[3].append('d')
    print("-----------")
    print(id(a), id(b))
    print(a)
    print(b)
    print(a is b)
    print(a[3] is b[3])
    

    通过上述的例子可以看出,我们改变变量a中父对象的值,不会影响变量b,但是改变变量a中子对象的值,那么变量b也会随之改变,这就是浅拷贝,只拷贝父对象,而不拷贝子对象。

    image

    图解: b = copy.copy(a): 浅拷贝, a 和 b 是一个独立的对象,但它们的子对象还是指向同一对象(内存地址)。

    • 深拷贝

    深拷贝,也就是完全拷贝,包括拷贝对象的父对象及其子对象。拷贝后是
    两个完全独立的对象,互不影响。我们可以通过copy模块中的deepcopy()方法来完成

    import copy
    
    a = [1, 2, 3, ['a', 'b', 'c']]
    b = copy.deepcopy(a)
    print(id(a), id(b))
    print(a is b)
    print(a)
    print(b)
    a.append(4)
    print("-----------")
    print(id(a), id(b))
    print(a)
    print(b)
    a[3].append('d')
    print("-----------")
    print(id(a), id(b))
    print(a)
    print(b)
    print(a is b)
    print(a[3] is b[3])
    

    通过上述的例子可以看出,不管我们改变变量a中父对象的值,还是改变子对象的值,都不会影响变量b的值,那么说明此时变量a和变量b已经完全独立,这就是深拷贝,拷贝父对象及其子对象。

    image

    图解: b = copy.deepcopy(a): 深拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

    • 参考文献:

    [1] http://blog.csdn.net/sinat_14849739/article/details/78516061

  • 相关阅读:
    Python Scarpy安装包
    pip install 出现报asciii码错误的问题
    pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
    北漂
    15再见,16你好。
    selenium By.xpath 用法
    java.util.NoSuchElementException解决办法
    Android版之数据库增删改查图书信息
    Android studio连接sqlserver数据库
    Android简易版图书管理系统
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504709.html
Copyright © 2011-2022 走看看