zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    英语中容易混淆单词
    Centos7 中安装 Redis 6.0.6
    JAVA基础- 为啥 Integer 中100=100 为true 而200=200则为false
    Java面试BIO,NIO,AIO 的区别
    Maven 中 dependencyManagement 干嘛用的
    代理实现流程
    使用do...while的方法输入一个月中所有的周日
    JavaScript---while和do while的区别
    微信小程序和H5之间相互跳转
    微信小程序进入广告实现
  • 原文地址:https://www.cnblogs.com/zx125/p/11309829.html
Copyright © 2011-2022 走看看