zoukankan      html  css  js  c++  java
  • 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 -

  • 相关阅读:
    XML文件的操作说明
    IIS中如何应用程序启用https协议
    sql server中的数据类型转换函数
    sql语句中的join连接(左连接、右连接、全连接、内连接)
    sql语句中日期相减的操作
    C# NameValueCollection集合
    json的两种表示结构(对象和数组).。
    ASP.NET中一般处理程序报的错误:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
    C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因
    《好好学Java 从零基础到项目实战》姗姗而来
  • 原文地址:https://www.cnblogs.com/wujiaqing/p/11024382.html
Copyright © 2011-2022 走看看