Python中淺拷貝和深拷貝的區別總結與理解


單層淺拷貝

import copy
a = 1  # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址相同

a = [1,2]  # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址不相同

單層深拷貝

import copy
a = 1  # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址相同

a = [1,2]  # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址不相同

結論一:

不管深拷貝還是淺拷貝對不可變數據類型都是引用內存地址

不管深拷貝還是淺拷貝對可變數據類型都是會重新創建新的內存空間

淺拷貝嵌套

# -----------不可變數據類型---------
# 情況一,內嵌可變數據類型
import copy
a = ([1,2],(3,4))  # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址相同
# 情況二,內嵌不可變數據類型
a = ((1,2),(3,4))  # 不可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址相同

#-----------可變數據類型-------------
# 情況一,內嵌可變數據類型
import copy
a = [(1,2),[3,4]]  # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址不相同

# 情況一, 可變數據類型 內嵌可變數據類型
import copy
a = [(1,2),(3,4)]  # 可變數據類型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 內存地址不相同

深拷貝嵌套

# -----------不可變數據類型---------
# 情況一,內嵌可變數據類型
import copy
a = ([1,2],(3,4))  # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址不相同
# 情況二,內嵌不可變數據類型
a = ((1,2),(3,4))  # 不可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址相同

#-----------可變數據類型-------------
# 情況一,內嵌可變數據類型
import copy
a = [(1,2),[3,4]]  # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址不相同
print(id(a[0]),id(copy_a[0]))  # 內存地址相同
print(id(a[1]),id(copy_a[1]))  # 內存地址不相同

# 情況一, 可變數據類型 內嵌可變數據類型
import copy
a = [(1,2),(3,4)]  # 可變數據類型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 內存地址不相同
print(id(a[0]),id(copy_a[0]))  # 內存地址相同

結論二:

淺拷貝:

  1. 外層是不可變類型、不管內層是否可變都是引用拷貝
  2. 外層是可變類型,不管內層是否可變都會從新創建新的內存空間

深拷貝:

  1. 外層是不可變類型,會遞歸判斷內層數據類型、如果可變則創建新的內存地址、都為不可變就是引用拷貝
  2. 外層是可變數據類型、不管內層是否可變都會創新新的內存地址、但是內部如果為可變則遞歸創建、不可變則為引用地址

總結:

淺拷貝:

  1. 淺拷貝只做最頂層的數據類型判斷
  2. 如果頂層是可變類型則創建新的內存空間
  3. 如果頂層是不可變數據類型就是引用拷貝

深拷貝

  1. 深拷貝做遞歸拷貝,可以遞歸拷貝所有的內部嵌套數據(可以理解為循環遍歷做淺拷貝判斷)
  2. 深拷貝遞歸拷貝遇到可變類型則創建新的內存空間
  3. 深拷貝遞歸拷貝遇到不可變數據類型就是拷貝的引用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM