Home >> Blog >> copy python - 在 Python 中複製 深複製和淺複製
copy python - 在 Python 中複製 深複製和淺複製
在 Python 中,Assignment 語句不複製對象,它們在目標和對象之間創建綁定。當我們使用=operator 時,用戶認為這會創建一個新對象;好吧,它沒有。它只創建一個共享原始對象引用的新變量。有時用戶想要使用可變對象,為了做到這一點,該用戶尋找一種方法來創建這些對象的“真實副本”或“clone”。或者,有時用戶想要用戶可以修改的副本而不同時自動修改原始副本,為了做到這一點,我們創建對象的副本。
有時需要一份副本,因此可以更改一份副本而不更改另一份。在 Python 中,有兩種創建副本的方法:
- 深複製
- 淺複製
為了製作這些副本,我們使用copy模塊。我們使用copy模塊進行淺複製和深複製操作。例如
# importing copy module
import copy
# initializing list 1
li1 = [1, 2, [3,5], 4]
# using copy for shallow copy
li2 = copy.copy(li1)
# using deepcopy for deepcopy
li3 = copy.deepcopy(li1)
在上面的代碼中,copy()返回 list 的淺複製並deepcopy()返回 list 的深層複製。
深複製是複製過程遞歸發生的過程。這意味著首先構造一個新的集合對象,然後遞歸地用在原始集合中找到的子對象的副本填充它。在深複製的情況下,對象的副本被複製到其他對像中。這意味著對對象副本所做的任何更改都不會反映在原始對像中。在 python 中,這是使用“ deepcopy() ”函數實現的。
T# Python code to demonstrate copy operations
# importing "copy" for copy operations
import copy
# initializing list 1
li1 = [1, 2, [3,5], 4]
# using deepcopy to deep copy
li2 = copy.deepcopy(li1)
# original elements of list
print ("The original elements before deep copying")
for i in range(0,len(li1)):
print (li1[i],end=" ")
print("\r")
# adding and element to new list
li2[2][0] = 7
# Change is reflected in l2
print ("The new list of elements after deep copying ")
for i in range(0,len( li1)):
print (li2[i],end=" ")
print("\r")
# Change is NOT reflected in original list
# as it is a deep copy
print ("The original elements after deep copying")
for i in range(0,len( li1)):
print (li1[i],end=" ")
輸出:
深複製前的原始元素
1 2 [3, 5] 4
深複製後的新元素列表
1 2 [7, 5] 4
深複製後的原始元素
1 2 [3, 5] 4
在上面的示例中,列表中所做的更改對其他列表沒有影響,表明該列表是深度複製的。
淺複製意味著構造一個新的集合對象,然後用在原始集合中找到的子對象的引用來填充它。複製過程不會遞歸,因此不會創建子對象本身的副本。在淺複製的情況下,對象的引用被複製到其他對像中。這意味著對對象副本所做的任何更改都會反映在原始對像中。在 python 中,這是使用“ copy() ”函數實現的。
# Python code to demonstrate copy operations
# importing "copy" for copy operations
import copy
# initializing list 1
li1 = [1, 2, [3,5], 4]
# using copy to shallow copy
li2 = copy.copy(li1)
# original elements of list
print ("The original elements before shallow copying")
for i in range(0,len(li1)):
print (li1[i],end=" ")
print("\r")
# adding and element to new list
li2[2][0] = 7
# checking if change is reflected
print ("The original elements after shallow copying")
for i in range(0,len( li1)):
print (li1[i],end=" ")
輸出:
淺複製前的原始元素
1 2 [3, 5] 4
淺複製後的原始元素
1 2 [7, 5] 4
在上面的示例中,列表中所做的更改確實影響了其他列表,表明該列表是淺複製的。
要點:
淺複製和深複製之間的區別僅與復合對象(包含其他對象的對象,如列表或類實例)相關:
- 淺複製構造一個新的複合對象,然後(在可能的範圍內)將對原始對像中的對象的引用插入其中。
- 深複製構造一個新的複合對象,然後遞歸地將在原始對像中找到的對象的副本插入其中。