關於python深copy與淺copy的一點理解

2021-09-25 20:33:36 字數 2752 閱讀 5846

一直對python深copy和淺copy似懂非懂的狀態,看了這篇文章,覺得自己懂了很多,給各位參考!

出處:

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])) # 記憶體位址相同

淺拷貝:

外層是不可變型別、不管內層是否可變都是引用拷貝

外層是可變型別,不管內層是否可變都會從新建立新的記憶體空間

深拷貝:

外層是不可變型別,會遞迴判斷內層資料型別、如果可變則建立新的記憶體位址、都為不可變就是引用拷貝

外層是可變資料型別、不管內層是否可變都會創新新的記憶體位址、但是內部如果為可變則遞迴建立、不可變則為引用位址

淺拷貝:

淺拷貝只做最頂層的資料型別判斷

如果頂層是可變型別則建立新的記憶體空間

如果頂層是不可變資料型別就是引用拷貝

深拷貝

深拷貝做遞迴拷貝,可以遞迴拷貝所有的內部巢狀資料(可以理解為迴圈遍歷做淺拷貝判斷)

深拷貝遞迴拷貝遇到可變型別則建立新的記憶體空間

深拷貝遞迴拷貝遇到不可變資料型別就是拷貝的引用

Python列表賦值 淺copy 深copy的區別

1.python中列表的賦值操作 賦值操作在其他語言裡也很常見,例 name1 centos 123123,fedora freebsd uos deepin flag name2 name1 這是python中列表的賦值方式,經過列印後列表name2和列表name1是一樣的 centos 1231...

Python 淺拷貝與深拷貝,copy模組

python中的任何變數都是物件 引用型別 python中的變數分為可變型別和不可變型別。淺拷貝和深拷貝都是拷貝可變型別內容,不可變型別不會拷貝 注意 因為元組是不可變型別,所以元組的淺拷貝並不會拷貝任何內容,而是直接引用源元組 和 賦值等同 如果元組中的元素都是不可變型別,那麼元組的深拷貝也並不會...

python 引用,淺copy和深拷貝

l 1,2,3,4 g l g 1 3 上面這個方法是引用複製,因為g和l是同乙個東東,輸出結果是 g 1,2,3,3 l 1,2,3,3 如果想複製所有的生成乙個新的list,那麼使用下面的方法 g data for data in l 這樣就全部的值都copy 過來 現在你再g 1 5,g和l ...