• 从零开始的Python学习Episode 8——深浅拷贝


    深浅拷贝

    一、浅拷贝

    列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存。当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数,复数,布尔,字符串,元组),会开拓一个新的内存空间用于存放新的数据,然后把列表中的地址修改为存放新数据的地址,此时没有出现问题。但当列表中存的不是一个简单的数据,而是一个可变类型(列表,字典),就会出现问题。下面用一个例子来解释:

    print('修改前')
    a = [[1,2],3,4]
    b = a.copy()
    print('a的值为',a)
    print('b的值为',b)
    print('修改后')
    b[0][1]=3
    print('a的值为',a)
    print('b的值为',b)

      输出如下

    结果发现修改了b中的值之后a中的值也跟着改变了。

    这是因为a中存的是列表[1,2]地址,a和b中的列表[1,2]地址是相同的,我修改b中的数据改变的是列表[1,2]内存地址所指向的数据,而没有修改列表[1,2]本身的地址,b还在指向列表[1,2],所以a和b会相互影响。

    用一张图来简单解释:

    为了解决这样的问题,可以使用

    二、深拷贝

    深拷贝可以重新开辟内存空间,将内容复制的更彻底,a和b之间相互没有影响。

    import copy
    
    print('修改前')
    a = [[1,2],3,4]
    b = copy.deepcopy(a)
    print('a的值为',a)
    print('b的值为',b)
    print('修改后')
    b[0][1]=3
    print('a的值为',a)
    print('b的值为',b)
    

      结果

    这样的话a和b之间就不会互相影响了。

    以上为个人理解,有误的话还请路过的大佬指正一下。

  • 相关阅读:
    web前端开发最佳实践--(笔记之JavaScript最佳实践)
    web前端开发最佳实践--(笔记一)
    HTML5及CSS3--freeCodeCamp(笔记一)
    javascript系列--函数(一)
    HTML5本地存储
    分享一些好用的设计网站
    .net面试问题总结
    ife_task10--弹性盒子
    WPF--搭建一个简单的demo
    信息技术文集
  • 原文地址:https://www.cnblogs.com/smilepup-hhr/p/9710899.html
Copyright © 2020-2023  润新知