Python中淺拷貝與深拷貝的案例實踐

2022-07-13 13:12:20 字數 3090 閱讀 7463

在本節中,您將通過執行python中的淺拷貝和深拷貝例項來理解copy模組創造副本的不同。

在python中,我們使用=運算子來建立物件的副本。您可能會認為這會建立乙個新物件。沒有。它僅建立乙個共享原始物件引用的新變數。

讓我們舉個例子,我們建立乙個名為 old_list 並將物件引用傳遞給 new_list使用=運算子。

#copy using = operator

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]

new_list = old_list

new_list[2][2] = 9

print('old list:', old_list)

print('id of old list:', id(old_list))

print('new list:', new_list)

print('id of new list:', id(new_list))

從輸出中可以看到兩個變數 old_list 和 new_list共享相同的id,即140673303268168

因此,如果您要修改 new_list 要麼 old_list,更改在兩者中均可見。

本質上,有時您可能希望保持原始值不變,而僅修改新值,反之亦然。在python中,有兩種建立副本的方法:

淺拷貝深拷貝

為了使這些複製生效,我們使用了copy模組。

我們將copypython模組用於淺層和深層複製操作。假設您需要複製化合物列表說x。例如:

import copy

copy.copy(x)

copy.deepcopy(x)

在這裡,copy()返回淺拷貝副本x。同樣,deepcopy()返回的深拷貝副本x。

淺拷貝副本會建立乙個新物件,該物件儲存原始元素的引用。

因此,淺拷貝副本不會建立巢狀物件的副本,而是僅複製巢狀物件的引用。這意味著複製過程本身不會遞迴或建立巢狀物件的副本。

import copy

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

new_list = copy.copy(old_list)

print("old list:", old_list)

print("new list:", new_list)

在上面的程式中,我們建立了乙個巢狀列表,然後使用copy()方法對其進行淺拷貝複製。

這意味著它將建立具有相同內容的新的獨立物件。為了驗證這一點,我們同時列印兩個old_list 和 new_list。

確認 new_list 與...不同 old_list,我們嘗試將新的巢狀物件新增到原始物件並進行檢查。

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

new_list = copy.copy(old_list)

print("old list:", old_list)

print("new list:", new_list)

在上面的程式中,我們建立了的淺拷貝副本 old_list。的new_list 包含對儲存在其中的原始巢狀物件的引用 old_list。然後,我們新增新的列表即[4, 4, 4]到old_list。此新子列表未複製到new_list。

但是,當您在其中更改任何巢狀物件時 old_list,更改出現在 new_list。

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

new_list = copy.copy(old_list)

old_list[1][1] = 'aa'

print("old list:", old_list)

print("new list:", new_list)

在以上程式中,我們對 old_list即old_list[1][1] = 'aa'。的兩個子列表old_list 和 new_list索引處[1][1]已修改。這是因為兩個列表共享相同巢狀物件的引用。

深層副本將建立乙個新物件,並以遞迴方式新增原始元素中存在的巢狀物件的副本。

讓我們繼續示例2。但是,我們將使用模組中提供的deepcopy()功能來建立深層副本copy。深層副本建立原始物件及其所有巢狀物件的獨立副本。

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

new_list = copy.deepcopy(old_list)

print("old list:", old_list)

print("new list:", new_list)

在上面的程式中,我們使用deepcopy()函式來建立外觀相似的副本。

但是,如果您更改原始物件中的任何巢狀物件 old_list,您將看不到副本的任何更改 new_list。

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

new_list = copy.deepcopy(old_list)

old_list[1][0] = 'bb'

print("old list:", old_list)

print("new list:", new_list)

在上面的程式中,當我們將新值分配給 old_list,我們只能看到 old_list被修改。這意味著old_list和new_list是獨立的。這是因為old_list 是遞迴複製的,這對於它的所有巢狀物件都是如此。

python 中的拷貝 淺拷貝與深拷貝

0.序列指什麼?序列型別是指容器內的元素從0開始的索引順序訪問,一次可以訪問乙個或者多個元素,包括字串 string 元組 tuple 列表 list the difference between tuple and list tuple would not be changed,but list ...

python中淺拷貝與深拷貝

淺拷貝,拷貝的是父物件,不會拷貝到內部的子物件。單從乙個淺字就可以看出他拷貝的東西不深,可以理解為只拷貝一層 import copy a 1,ss 2,3 b copy.copy a print b print id a print id b 現在有乙個列表a裡面有數字,字串,列表和字典 用淺拷貝的...

Python中的淺拷貝與深拷貝

1.淺拷貝 情況1的例項如下 import copy a 1,2 b 3,4 c a,b 注意這裡的c就是乙個可變物件!d copy.copy c print 變數c c print print 變數d d 結果 變數c 1,2 3,4 變數d 1,2 3,4 原因分析 需要拷貝的物件c是乙個lis...