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 -

原文地址:https://www.cnblogs.com/wujiaqing/p/11024382.html