• python的深浅拷贝-成为马老师的弟子


    参考链接

    骏马金龙

    前提

    想要了解深浅拷贝之前必须要知道可变和不可变类型,和他们的特性

    不可变类型

    数字 字符串 元组 不可变集合
    
    特性:改变值,会创建新的内存空间存储数据
    

    可变类型

    列表 字典 可变列表
    
    特性:改变值,还是引用之前的内存空间
    

    Python引用赋值

    开篇

    引用赋值其实就是=,多个变量指向同一个内存空间

    不可变案例

    #a指向1000的内存地址
    a = 1000
    #b也指向1000的内存地址
    b = a
    #a指向了2000的地址,b指向1000的内存地址
    a = 2000
    

    可变案例

    L = [333,444,555]
    L[1] = 4444
    #L的地址是没有变化的,但是L[1]的地址发生的变化
    

    列表的内存

    列表的内存结构图,第一层的地址是不会随内容的改变而改变的

    Python深浅拷贝

    注意

    深浅拷贝这个概念其实是针对可变数据类型的,不可变类型就没有这个概念

    深浅拷贝概念

    浅拷贝

    shallow copy,只拷贝第一层的数据。copy模块的copy()就是浅拷贝

    深拷贝

    deep copy,递归拷贝所有层次的数据,python中copy模块的deepcopy()是深拷贝

    浅拷贝

    只拷贝了第一层的数据,存放在另一个空间

    马老师亲手给我画的图

    为下列代码的内存分布图

    from copy import copy
    a = [1,2,3]
    b = [4,5,a]
    c = copy(b)
    
    #查看id
    #id不同.第一层是完全独立的
    print(id(b),id(c))
    
    #第二层还是引用的同一个列表
    b[2][0] = 200
    print(id(b[2]),id(c[2]))
    
    
    1800001515976 1799717541960
    1800000907528 1800000907528
    

    深拷贝

    完全拷贝,两个空间是完全独立的,没有一点关系了

    from copy import deepcopy
    a = [1,2,3]
    b = [4,5,a]
    c = deepcopy(b)
    
    #全部独立
    print(id(b),id(c))
    print(id(b[2]),id(c[2]))
    
    2214201160136 2216093571144
    2214200551688 2214201162312
    
  • 相关阅读:
    设计模式(十八)备忘录模式
    六种常见的系统架构
    设计模式(十七)中介者模式
    设计模式(十六)观察者模式
    设计模式(十五)迭代器模式
    js实现对象深拷贝
    js中for in与for of使用
    在使用一些UI框架的某些组件的时候,,取消事件冒泡
    js开根号,使用二分法迭代
    js逆向递归 一个多维数组根据子节点ID查找所有父节点ID
  • 原文地址:https://www.cnblogs.com/zx125/p/11309829.html
Copyright © 2020-2023  润新知