1. 程式人生 > 實用技巧 >深拷貝和淺拷貝的區別

深拷貝和淺拷貝的區別

首先介紹一下記憶體劃分

記憶體分為五個區域,即堆記憶體,棧記憶體,全域性記憶體,常量區,程式碼區,其中各個分割槽的作用如下:

  • 堆記憶體:記錄程式中臨時申請的變數值,即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改變的結果一致

知道了深拷貝原理,那麼兩者的區別我就不用多說了吧!!!