先看一段简短的代码,你觉得输出的list1和list2是否一致(图1)?
相信不少人会回答list1=[1,2,3],list2=[5,2,3]。但其实正确的答案是list1=list2=[5,2,3]。
这段代码就是基础的浅拷贝。如何区分深拷贝与浅拷贝呢,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
01机器绘制藏宝图 机器绘制藏宝图
浅拷贝
当创建对象,比如一个列表时,Python 会给它分配一块内存来存储数据。当我们需要复制这个对象就是拷贝。浅拷贝这种方式,在我们复制这个对象时,只复制这个对象的第一层内容,不会复制更深层的内容。
举个生活中的例子,假设有一个包装箱,里面装了一些球。现在我们想要复制这个箱子。浅拷贝就像是复制箱子,但不会复制里面的球,只是复制了箱子本身。如果这个箱子里面还有盒子,而这些盒子里装着一些东西,那么浅拷贝就只会复制最外层的箱子,而不会复制里面的盒子和盒子里的东西。所以,如果在原始箱子的盒子里改变了东西,那复制出来的箱子里的盒子也会变化,因为它们其实是同一个盒子,只不过装在不同的箱子里。
在Python中切片操作,copy模块中的cop()方法,list( )、dict( )、set( )等构造方法都可以进行浅拷贝。对于简单的数据结构,浅拷贝可以很好地工作,但在处理嵌套结构时,需要注意对原始对象和其副本之间的关系,避免意外修改原始数据(图2)。
深拷贝
可以想象为制作一个手工复制的画作。假设有一幅画,这幅画上面画了一个风景,而这个风景里有一些小细节,比如树、花朵、动物等等。现在,你想要复制这幅画。深拷贝就是将这个画上的每一个细节都完全手工复制到一张新的画布上,包括每一棵树、每一朵花和每一个动物,确保新的画和原始画一模一样。
深拷贝就像是制作了一份全新的一样的画作,不仅画面内容相同,而且每一个小细节也都被复制了过来。这样,无论你对复制品做什么修改,原始的画作都不会受到任何影响,就像是两幅完全独立的画一样。深拷贝创建了一个全新的对象,并且递归地复制原始对象中的所有内容,包括内部嵌套的对象。这意味着即使原始对象包含其他对象,也会复制这些对象的副本,而不是引用。在 Python 中,可以使用 copy.deepcopy() 方法进行深拷贝(图3)。
通过这段代码你可以看到两种拷贝的区别(图4)。
理解深拷贝和浅拷贝的概念,以便在编程中正确选择适当的拷贝方式,同时避免意外修改原始数据,提高代码的健壮性和可维护性。拥有对深拷贝和浅拷贝的正确理解,将会在处理数据和对象时大有裨益。
邮发代号:77-19
单价:8元,年价:408元
编辑|张毅
审核|吴新
领取专属 10元无门槛券
私享最新 技术干货