深拷贝和浅拷贝的区别

首先介绍一下内存划分

内存分为五个区域,即堆内存,栈内存,全局内存,常量区,代码区,其中各个分区的作用如下:

  • 堆内存:记录程序中临时申请的变量值,即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改变的结果一致

知道了深拷贝原理,那么两者的区别我就不用多说了吧!!!

posted @ 2020-08-22 11:33  良木66  阅读(231)  评论(0)    收藏  举报