很多人第一次听到“浅拷贝”和“深拷贝”的时候,都会觉得这俩词挺像的,好像也差不多。但真要在代码里用的时候,往往会遇到一些意想不到的坑。其实这两个概念的区别,本质上就是拷贝的时候,到底是复制对象本身,还是顺带把里面嵌套的东西也复制一份。
浅拷贝就好比你复印了一份文件,但里面夹的附件只是写了“参考某某资料”,你复印的时候也只是把这句话带过去,附件本身没动。也就是说,浅拷贝只会拷贝对象的第一层内容,如果对象里面还有嵌套的可变对象,比如列表、字典,它们还是指向原来的地址。
在 Python 里常见的浅拷贝方式有几种,比如用 copy.copy(),或者有些内置方法(像切片)也会默认给你浅拷贝。
你看,最外层的列表确实是新建了一份,但里面的 [2, 3] 还是公用的,所以改了 b 里面的值,a 也跟着变了。
深拷贝就更彻底一些,相当于你不但复印了文件,还把所有的附件、参考资料也都一份份拷贝出来。这样一来,新对象和原对象完全独立,互不影响。
Python 提供了 copy.deepcopy() 来实现深拷贝:
这里就能看到,改了 b 之后,a 完全没受影响,因为内外层都被复制了一份。
什么时候用浅拷贝,什么时候用深拷贝如果对象里面没有嵌套太复杂的结构,或者你本来就希望它们共享一部分数据,那浅拷贝就够用了,速度还快。比如复制一个只有数字的列表,浅拷贝和深拷贝结果其实没差别。 但如果你的数据结构里层层嵌套,或者你特别想保证拷贝之后彼此独立,互不干扰,那就老老实实用深拷贝。
顺带提一句,深拷贝虽然方便,但它会递归地去复制每一层对象,在一些结构特别庞大的场景下,性能和内存占用都会比较高,得小心。
以上就是“浅拷贝(Shallow Copy) 和深拷贝(Deep Copy) 的区别是什么?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/13518/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料