• Python 之分辨双胞胎:copy(浅拷贝)与 deepcopy(深拷贝)


    引言

      copy 和 deepcopy 是一对”双胞胎“,基本功能都是“复制”,但他们一个被称为“浅拷贝”,另一个被称为“深拷贝”,两者之间一定是有差别的。相信很多python入门的童鞋们在刚接触这对”双胞胎“的时候也像我一样傻傻分不清。所以,今天我就给大家仔细剖析一下他们俩的区别。

     

      我们日常生活中经常会用到copy,尤其是在使用电脑的时候,无论是把资料拷贝到U盘中,还是在文档中简单地拷贝一段文字,其实际意义就是将同一份数据一分为二成两份一模一样数据,而这两份相同的数据是独立存在的,当我们修改拷贝的新数据内容的时候,并不会对原先的旧数据进行更改。

     

      那么,重点来了。

    deepcopy

      deepcopy 就和我们寻常理解的意义一样,都是拷贝原数据,形成一份新的相同数据,并且两份数据独立存在。

     

      我们可以用一段代码清楚地表现 deepcopy :

    import copy
    
    names = ['Ellen','Amy',"Alex",['Tony','Jane'],'Jennifer']
    copy1 = copy.deepcopy(names)   # 深拷贝
    copy1[3][0] = 'Ben'       # 修改copy1的第4个元素列表中的第一个子元素
    
    print(names)   # 打印原数据
    print(copy1)   # 打印修改后的拷贝数据
    
    # 结果返回:
    ['Ellen', 'Amy', 'Alex', ['Tony', 'Jane'], 'Jennifer']
    ['Ellen', 'Amy', 'Alex', ['Ben', 'Jane'], 'Jennifer']

      很明显,拷贝的数据已被修改,而原数据不受影响。这下明白了吧。那么你可能就会问了, copy 又是什么鬼?

    copy

      先直接看代码好了。

    import copy
    
    names = ['Ellen','Amy',"Alex",['Tony','Jane'],'Jennifer']
    copy2 = copy.copy(names)       # 浅拷贝
    copy2[3][0] = 'Ben'       # 修改copy2的第4个元素列表中的第一个子元素
    
    print(names)     # 打印原数据
    print(copy2)     # 打印修改后的拷贝数据
    
    # 结果返回:
    ['Ellen', 'Amy', 'Alex', ['Ben', 'Jane'], 'Jennifer']
    ['Ellen', 'Amy', 'Alex', ['Ben', 'Jane'], 'Jennifer']

      可以看到,浅拷贝后的数据进行修改后,不仅拷贝的数据发生了变化,连原数据都相应改变了。这就说明,浅拷贝实际上是一个引用的功能,用一个新的标签引用原数据。

    总结

      最后,总结一下。

      deepcopy : 即深拷贝,与我们寻常理解的拷贝的意义相同,拷贝原数据,形成新的相同数据,并且两份数据保持独立,没有关联关系。

      copy: 即浅拷贝,拷贝原数据,实际上是给原数据贴上新的标签,都是指向同一对象。既然两个数据是指向相同对象,当其中一个数据做出修改,另一个数据也随之改变。

    - End -

  • 相关阅读:
    Java SE 第十二,三,四,五六讲 Java基础知识回顾
    Java SE第二十一 抽象类
    Java SE 第二十讲 static与final关键字详解
    使用AspNetPager分页的范例
    AJax错误"WebForm1"没有定义的javascript错误的解决方法
    如何为自定义的控件在工具箱中自定义个性化的图标
    C#面向对象名词比较(转ttyp 的文章)
    vs2003自带的报表使用load("rpt.rpt")方式,显示不出报表工具的图片解决方案
    DropDownlist常见的小错误
    Ajax获取数据库中的字段
  • 原文地址:https://www.cnblogs.com/wujiaqing/p/11024382.html
Copyright © 2020-2023  润新知