分辨双胞胎: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 -

猜你喜欢

转载自www.cnblogs.com/wujiaqing/p/11024382.html