複製到 Python(深拷貝和淺拷貝)

| | | |

有時需要一份副本,這樣您就可以更改一份而不更改另一份。 Python有兩種複制方式:

  • 深複製
  • 淺複製

為了製作這些副本,我們使用複製 模塊。我們使用 copy 模塊進行淺拷貝和深拷貝操作。例如


#導入複製模塊

import 複製


# 初始化列表 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# 淺拷貝使用copy

li2 = 複製.copy ( li1)


# 使用 Deepcopy 進行 Deepcopy

li3 = copy.deepcopy(li1)

在上面的代碼中,copy() 返回列表的淺拷貝,deepcopy() 返回列表的深拷貝。

deepcopy

深拷貝 —這是一個複製過程遞歸發生的過程。這意味著首先創建一個新的集合對象,然後用在原始集合中找到的子對象的副本遞歸地填充它。在深拷貝的情況下,一個對象的副本被複製到另一個對象。這意味著對象的副本所做的任何更改都不會反映在原始對像中。在 python 中,這是使用 deepcopy () 函數完成的。


# 演示複製操作的 Python 代碼

code>


#import"複製"用於復制操作

import copy


# 初始化列表 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# 使用 Deepcopy 進行深拷貝

li2 = copy.deepcopy (li1)


# 原始列表項

print ( "深拷貝前的原始元素" )

for i in range ( 0 , len (li1)):

print (li1 [i], end = " " )

打印 ( " " )


# 將項目添加到新列表中

li2 [ 2 ] [ 0 ] = 7


# 變化體現在 l2 中

print ( "深拷貝後的新元素列表" )

for i in range ( 0 , len (li1)):

print (li2 [i], end = "" )


p rint ( "" )


# 改變的是未反映在原始列表中
# 像深拷貝

print ( "深拷貝後的原始元素" )

for i in range ( 0 , len (li1)):

print (li1 [i], end = "" )

退出:

原來的元素s 深拷貝前的 1 2 [3, 5] 4 深拷貝後的新元素列表 1 2 [7, 5] 4 深拷貝後的原始元素 1 2 [3, 5] 4 

在上例中,對list的改動沒有影響其他list,表示深拷貝list。

淺拷貝

淺拷貝意味著創建一個新的集合對象,然後用找到的子對象的引用填充它在原來的。複製過程不會重複,因此不會創建子對象本身的副本。在淺拷貝的情況下,對一個對象的引用被複製到另一個對象。這意味著對象的副本所做的任何更改都會反映在原始對像中。Python 使用“copy () ”函數來實現這一點。


# Python 代碼演示複製操作


#導入"複製"用於復制操作

import copy


# 初始化列表 1

li1 = [ 1 , 2 , [ 3 , 5 ], 4 ]


# 淺拷貝使用copy

li2 = copy.copy (li1)


# 原始列表項

print ( "淺拷貝前的原始元素" )

for i in range ( 0 , len (li1)):

print (li1 [i], end = "" )


打印 ( "" )


# 添加和項目到新列表

li2 [ 2 ] [ 0 ] = 7


# 檢查更改是否反映

print ( "淺拷貝後的原始元素" )

for i in range ( 0 , len (li1 )):

print (li1 [i], end = " " )

退出:

淺拷貝前的原始元素1 2 [3, 5] 4 淺拷貝後的原始元素 1 2 [7, 5] 4 

上例中,對list所做的改動是 對另一個列表生效,表示複製了該列表。

要點:
淺拷貝和深拷貝的區別只適用於復合對象(包含其他對象,例如列表或類實例):

  • 淺拷貝創建一個新的複合對象,然後(盡可能)插入對原始對象的引用。
  • 深拷貝會創建一個新的複合對象,然後遞歸地將在原始對像中找到的對象的副本插入其中。