深拷贝和浅拷贝的区别
首先介绍一下内存划分
内存分为五个区域,即堆内存,栈内存,全局内存,常量区,代码区,其中各个分区的作用如下:
- 堆内存:记录程序中临时申请的变量值,即var值
- 栈内存:记录堆内存中存储常量值的地址,即指针pointer
- 全局内存:记录程序中的静态变量,即static
- 常量区:记录程序中的常量,即const
- 代码区:存放编译后的代码,即二进制序列串(计算机归根结底就是0和1)
浅拷贝和深拷贝的区别
浅拷贝
浅拷贝是什么?很简单,就是将放在栈内存中的指针重新复制一份,但是指针指向的堆内存位置不变。
举个例子:
假设堆内存中有一变量v,其由栈内存中的A标识其位置,即A是V的指针,A——>v
进行一次浅拷贝,拷贝变量v,拷贝结果为B。
此时的B为一个指针,其指向v,B——>v
用伪代码标识一下就是
var A = v # 申请一个变量A,内容为v
B = A # copyA
B = v1 # 改变B指向的内容
print(A) # 打印A指向内容
result:v1 # 打印结果和B改变的结果一致
讲到这里,估计已经懂什么叫浅拷贝了,所谓的浅拷贝就是复制一份指针,而不改变指针的地址。浅拷贝只与栈内存有关,与堆内存无关。
深拷贝
深拷贝是什么?很简单,堆内存与栈内存都重新复制一份,复制的新拷贝体与被拷贝体无关。继续借用上个例子理解:
假设堆内存中有一变量v,其由栈内存中的A标识其位置,即A是V的指针,A——>v
进行一次深拷贝,在堆内存中重新分配一个内存区域,用来记录v的复制体v1,并且在栈内存中重新分配一个指针B,此指针指向堆内存中的v1
此时的B为一个指针,其指向v1,B——>v1
var A = v # 申请一个变量A,内容为v
B = deepCopy(A) # deepCopyA
B = v2 # 改变B指向的内容
print(A) # 打印A指向内容
result:v # 打印结果和B改变的结果一致
知道了深拷贝原理,那么两者的区别我就不用多说了吧!!!


浙公网安备 33010602011771号