• 浅析深拷贝与浅拷贝


    01 深拷贝与浅拷贝

    1. 定义解释

    简单理解, 深拷贝和浅拷贝就是拷贝内容的层次深度不同。深拷贝全部都是新的(递归),浅拷贝只有第一层是新的。

    指向

    a = [11, 22] 指在内存中开辟一个空间,存储[11, 22]这个列表,a 指向这个空间的内存地址。
    b = a , 表示b 也指向这个内存地址,没有开辟新的内存空间。
    id(a) = id(b)

    另外: a == b (True) 内容相同, a is b (True) 内存地址相同

    浅拷贝

    浅拷贝只是单纯地拷贝要拷贝的东西的指向,但是不拷贝指向的内存地址中的内容。(拷贝C的快捷方式)

    import copy
    a = [11, 22]
    b = [33, 44]
    c = [a, b]
    e = copy.copy(c)
    id(e) = id(c)
    
    id(e)
    Out[41]: 2447913914184
    id(c)
    Out[42]: 2447914220744
    id(e[0])
    Out[43]: 2447913762952
    id(c[0])
    Out[44]: 2447913762952
    
    # 在c中新增一个数值,e不会改变
    c.append(55)
    c
    Out[47]: [[11, 22], [33, 44], 55]
    e
    Out[48]: [[11, 22], [33, 44]]
    
    # 但是在a中新增一个数值,则e也会改变
    a.append(66)
    c
    Out[50]: [[11, 22, 66], [33, 44], 55]
    e
    Out[51]: [[11, 22, 66], [33, 44]]
    

    表明, 当e = copy.copy(c) 浅copy 时, 只copy了c 的指向,并没有生成新的a, b

    深拷贝

    f = copy.deepcopy(c) ,生成了存储内容跟a, b 一样的新的内容空间

    f = copy.deepcopy(c)
    id(f[0]) == id(c[0])
    Out[60]: False
    

    2. 特殊情况

    当拷贝的对象是元组类型时

    a = (11, 22)
    b = (33, 44)
    a = (11, 22)
    b = a
    c = copy.copy(a)
    d = copy.deepcopy(a)
    id(b)
    Out[67]: 2447914673928
    id(c)
    Out[68]: 2447914673928
    id(d)
    Out[69]: 2447914673928
    

    如果copy.copy拷贝的是元组,那么它不会进行浅拷贝,仅仅是指向。
    原因: 因为元组是不可变类型,那么意味着数据一定不能修改,因此copy.copy的时候会自动判断,是元组就指向

    a = [11, 22]
    b = [33, 44]
    c = (a, b)
    d = copy.copy(c)
    e = copy.deepcopy(c)
    id(c)
    Out[75]: 2447914777800
    id(d)
    Out[76]: 2447914777800
    id(e)
    Out[77]: 2447914770824
    

    如果用copy.copy 或者copy.deepcopy对一个全部都是不可变类型的数据进行拷贝,那么他们的结果相同,都是引用指向。
    如果拷贝的是一个不可变类型的数据,即使元组是最顶层,那么deepcopy依然是深拷贝,而copy.copy还是指向。

  • 相关阅读:
    Android PopupWindow显示位置和显示大小
    线性回归与梯度下降
    nginx启动过程分析
    项目管理学习笔记之三.绩效分析
    会计总论读书笔记
    电子书阅读及工具
    mybatis-mysql小优化
    List去重
    JAVA8之lambda表达式详解,及stream中的lambda使用
    linux部署mongodb及基本操作
  • 原文地址:https://www.cnblogs.com/hp-lake/p/12219925.html
Copyright © 2020-2023  润新知