• 六.python的深浅拷贝


    一.拷贝

    参考原文

    1.赋值

    (1)数字和字符串的拷贝
    a1 = 123123
    a2 = 123123

    输出结果是:

    1959780298352
    1959780298352

    结论:对于通过用 = 号赋值,数字和字符串在内存当中用的都是同一块地址。

    2.浅拷贝

    import copy  # 使用浅拷贝需要导入copy模块
     
    a1 = 123123
    a3 = copy.copy(a1)  # 使用copy模块里的copy()函数就是浅拷贝了
    print(id(a1))
    print(id(a3))
    
    >>35233168
    >>35233168
    

    结论:对于浅拷贝,数字和字符串在内存当中用的也是同一块地址。

    3.深拷贝

    import copy
    
    a1 = 123123
    a4 = copy.deepcopy(a1)  # 深拷贝是用copy模块里的deepcopy()函数
    print(id(a1))
    print(id(a4))
    
    >>31432080
    >>31432080
    

    查看结果发现,对于深拷贝,数字和字符串在内存当中用的也是同一块地址。
    在这里插入图片描述

    二、字典、列表、元组等其他类型的拷贝

    1.赋值

    在这里插入图片描述

    2.浅拷贝

    import copy
    
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 678]}
    n3 = copy.copy(n1)  # 浅拷贝
    print("第一层字典的内存地址:")
    print(id(n1))
    print(id(n3))
    print("第二层嵌套的列表的内存地址:")
    print(id(n1["k3"]))
    print(id(n3["k3"]))
    
    

    第一层字典的内存地址:
    6516024
    6516096
    第二层嵌套的列表的内存地址:
    36995720
    36995720

    通过以上结果可以看出,进行浅拷贝时,我们的字典第一层n1和n3指向的内存地址已经改变了,但是对于第二层里的列表并没有拷贝,它的内存地址还是一样的。原理如下图:
    在这里插入图片描述
    结论:所以对于浅拷贝,字典、列表、元组等类型,它们只拷贝第一层地址。

    3.深拷贝

    import copy
    
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 678]}
    n4 = copy.deepcopy(n1)  # 深拷贝
    print("第一层字典的内存地址:")
    print(id(n1))
    print(id(n4))
    print("第二层嵌套的列表的内存地址:")
    print(id(n1["k3"]))
    print(id(n4["k3"]))
    
    输出结果:
    
    第一层字典的内存地址:
    31157560
    35463600
    第二层嵌套的列表的内存地址:
    35947144
    35947336
    

    通过以上结果发现,进行深拷贝时,字典里面的第一层和里面嵌套的地址都已经变了。对于深拷贝,它会拷贝多层,将第二层的列表也拷贝一份,如果还有第三层嵌套,那么第三层的也会拷贝,但是对于里面的最小元素,比如数字和字符串,这里就是“wu”,123,“alex”,678之类的,按照python的机制,它们会共同指向同一个位置,它的内存地址是不会变的。原理如下图:
    在这里插入图片描述

    结论:对于深拷贝,字典、列表、元组等类型,它里面嵌套多少层,就会拷贝多少层出来,但是最底层的数字和字符串地址不变。

    参考原文
    注:本文是根据老男孩课程内容整理而成的,图片也是出自武sir的,所以下面贴一下武sir的博客地址。本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。

    武sir博客地址:http://www.cnblogs.com/wupeiqi/

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    iOS"伪后台"机制下如何保持APP一直运行在后台(转)(实践通过)
    weak和strong
    iOS webview 清除缓存
    iOS隐藏状态栏
    IOS 在一个应用里打开另一个应用 及其 两个应用互相调用
    ios 检查ios设备是否安装了qq,微信等应用
    【干货篇】步步为营,带你轻松掌握jQuery!
    【化繁为简】非前端开发者的福音---CSS的预处理语言 Less&Sass
    JS中有关分支结构、循环结构以及函数应用的一些简单练习
    万物皆对象的JavaScript
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561154.html
Copyright © 2020-2023  润新知