APP下载

面试官:谈谈你对 Python 中的浅拷贝和深拷贝的理解

消息来源:baojiabao.com 作者: 发布时间:2024-05-09

报价宝综合消息面试官:谈谈你对 Python 中的浅拷贝和深拷贝的理解

写在前面:文末附有Python学习资料哦,转发文章并私信小编“学习”,即可领取

假设你去面试 Python 开发岗,面试官如果对基础比较看重的话,那么很可能会问你这样的问题

“谈谈你对 Python 中的浅拷贝和深拷贝的理解?”

若平时你在开发中像我一样,过度使用 deepcopy,以至于忘记了浅拷贝(shallow copy)和深拷贝(deep copy)的区别,那很可能要栽大跟头了。建议在读这篇文章之前,看下我之前写的文章《你真的理解Python中的赋值、传参吗?》,它有助于你更快的理解本文

Python 的引用计数

首先我们要知道,Python 内不可变物件的内存管理方式是引用计数。因此,我们在谈论拷贝时,其实谈论的主要特点都是基于可变物件的。我们来看下面这段程式码

输出如下

因为我们这里操作的是不可变物件,Python 用引用计数的方式管理它们,所以 Python 不会对值相同的不可变物件,申请单独的内存空间。只会记录它的引用次数

浅拷贝

我们先来比较一下浅拷贝和赋值在可变物件上的区别

输出结果

发现没有,赋值就是对物体进行贴标签操作,作用于同一物体。而浅拷贝则会建立一个新的物件,至于物件中的元素,它依然会引用原来的物体,我们再来看一段例子

输出如下

操作不可变物件时,由于引用计数的特性,被拷贝的元素改变时,就相当于撕掉了原来的标签,重新贴上新的标签一样,对于我们已拷贝的元素没有任何影响。因此在操作不可变物件时,浅拷贝和深拷贝是没有区别的

输出结果

由于浅拷贝会使用原始元素的引用(内存地址)。所以在在操作被拷贝物件内部的可变元素时,其结果是会影响到拷贝物件的

深拷贝

深拷贝遇到可变物件,则又会进行一层物件建立,所以你操作被拷贝物件内部的可变物件,不影响拷贝物件内部的值

输出如下

总结

因此,在下次我们遇到这类问题时,我们说出以下关键点,基本就很稳了

由于 Python 内部引用计数的特性,对于不可变物件,浅拷贝和深拷贝的作用是一致的,就相当于复制了一份副本,原物件内部的不可变物件的改变,不会影响到复制物件浅拷贝的拷贝。其实是拷贝了原始元素的引用(内存地址),所以当拷贝可变物件时,原物件内可变物件的对应元素的改变,会在复制物件的对应元素上,有所体现深拷贝在遇到可变物件时,又在内部做了新建了一个副本。所以,不管它内部的元素如何变化,都不会影响到原来副本的可变物件最后,小编给大家分享一份Python学习从入门到精通的全套学习资料

转发此文,关注并私信小编“学习”马上免费领取

2019-10-06 02:50:00

相关文章