浅拷贝与深拷贝

引言

在编程中,深拷贝和浅拷贝是两种不同的对象复制方法,它们的主要区别在于复制的对象是否包含对其它对象的引用,以及这些引用是否也被复制。

一、浅拷贝

浅拷贝是指创建一个新的对象,这个新对象与原对象具有相同的属性值,但如果属性值是对其它对象的引用,那么这两个对象将共享这些引用。也就是说,浅拷贝只复制了对象本身和它的直接属性值,但并没有复制这些属性值所引用的对象。

二、深拷贝

深拷贝是指不仅复制对象本身和它的直接属性值,还递归地复制这些属性值所引用的所有对象。也就是说,深拷贝会创建一个全新的对象及其所有子对象,并且这些新对象与原对象之间没有共享引用。

三、示例

Java没有像Python的copy模块那样内置的简单函数来进行浅拷贝和深拷贝(Java需要通过实现特定的接口(如Cloneable)或者编写自定义的复制逻辑来实现这些功能)。所以这里为了更加清晰明了选用Python来解释浅拷贝与深拷贝。

假设有如下列表:

python 复制代码
import copy

list1 = [1, 2, [3, 4]]

使用浅拷贝:

python 复制代码
list2 = copy.copy(list1)

此时list1和list2都包含相同的元素值,但如果改变了list1[2](即内部列表),那么这种改变也会反映在list2上,因为这两个列表中的第三个元素实际上是同一个对象。

使用深拷贝:

python 复制代码
list3 = copy.deepcopy(list1)

在这里,list3是一个全新的副本,包括内部列表也是新的。因此,对list1所做的任何更改都不会影响到list3。

四、总结

浅拷贝:只复制对象本身和它的直接属性值,但不复制这些属性值所引用的对象。

深拷贝:不仅复制对象本身和它的直接属性值,还递归地复制这些属性值所引用的所有对象。

相关推荐
爬虫程序猿8 分钟前
利用 Java 爬虫获取淘宝商品 SKU 详细信息实战指南
java·开发语言·爬虫
F2E_Zhangmo11 分钟前
基于cornerstone3D的dicom影像浏览器 第五章 在Displayer四个角落显示信息
开发语言·前端·javascript
He19550129 分钟前
Go初级之十:错误处理与程序健壮性
开发语言·python·golang
m0_738120721 小时前
CTFshow系列——PHP特性Web93-96
开发语言·安全·web安全·php·ctfshow
m0_570466411 小时前
代码随想录算法训练营第二十八天 | 买卖股票的最佳实际、跳跃游戏、K次取反后最大化的数组和
java·开发语言·算法
程序喵大人1 小时前
分享个C++线程池的实现源码
开发语言·c++·线程池
和鲸社区1 小时前
《斯坦福CS336》作业1开源,从0手搓大模型|代码复现+免环境配置
人工智能·python·深度学习·计算机视觉·语言模型·自然语言处理·nlp
不会吃萝卜的兔子1 小时前
go webrtc - 1 go基本概念
开发语言·golang·webrtc
豌豆花下猫2 小时前
Python 潮流周刊#118:Python 异步为何不够流行?(摘要)
后端·python·ai