一、列表拷貝概述
列表是Python的一種內置數據類型,它是一個有序的、可變的、可重複的集合。在Python中,我們可以通過「=」號進行列表的拷貝。但是,這種拷貝只是對原列表的一種淺拷貝,即原列表和新列表共享同一塊內存空間。因此,當我們對新列表進行修改時,原列表也會發生相應的變化。
為了解決這種問題,我們可以採用不同的方法進行列表的深拷貝和淺拷貝,以滿足不同的需求。
二、淺拷貝
淺拷貝是一種基於副本的拷貝方法,它是指新的對象(列表)與原對象(列表)共享同一篇內存空間,具有相同的id()值。
Python中提供了多種淺拷貝方法,如分片拷貝、列表函數copy()、列表函數list()等。下面我們對這些方法進行詳細介紹。
1、分片拷貝
old_list = [1, 2, 3]
new_list = old_list[:]
print(id(old_list) == id(new_list))
這種方法比較簡單,我們只需要在括號中指定要拷貝的下標範圍即可。值得注意的是,如果拷貝的是一個多維列表,那麼它只會進行第一層的淺拷貝。
2、列表函數copy()
old_list = [1, 2, 3]
new_list = old_list.copy()
print(id(old_list) == id(new_list))
這種方法與分片拷貝類似,也是基於副本的拷貝方法,與原對象共享同一個內存空間。這種方法適用於對中等大小的列表進行拷貝。
3、列表函數list()
old_list = [1, 2, 3]
new_list = list(old_list)
print(id(old_list) == id(new_list))
與copy()方法類似,list()方法也是一種淺拷貝方法,新的對象與原對象共享同一塊內存空間;同時,list()方法還可以將其他序列(如元組、字符串、集合等)轉換成列表類型。
三、深拷貝
深拷貝是一種將原對象完全複製到新的對象中的拷貝方法,新的對象與原對象具有不同的內存地址及id()值。當原對象進行修改時,與之相應的新對象不會改變。
Python中提供了多種深拷貝方法,如copy模塊中的copy()和deepcopy(),我們分別對它們進行詳細介紹。
1、copy模塊中的copy()
import copy
old_list = [[1, 2, 3], [4, 5, 6]]
new_list = copy.copy(old_list)
print(id(old_list) == id(new_list))
print(id(old_list[0]) == id(new_list[0]))
這種方法是一種具有遞歸思想的深拷貝方法。當原對象為簡單的列表類型時,該方法與淺拷貝方法相同;當原對象為嵌套列表時,該方法會遞歸的對嵌套列表的元素進行深拷貝,直到拷貝到不可變對象為止。
2、copy模塊中的deepcopy()
import copy
old_list = [[1, 2, 3], [4, 5, 6]]
new_list = copy.deepcopy(old_list)
print(id(old_list) == id(new_list))
print(id(old_list[0]) == id(new_list[0]))
這種方法是一種最完全的深拷貝方法,它會遞歸的拷貝所有嵌套列表的元素,並將其複製到一個新的對象中。與前面介紹的淺拷貝和copy()方法不同的是,這種方法完全不受原對象的影響。
四、總結
列表拷貝是Python中最基本的操作之一,在不同的場景下,我們可以選擇不同的拷貝方式,以滿足不同的開發需求。淺拷貝方法是一種基於副本的拷貝方式,它可以對中等大小的列表進行拷貝。深拷貝方法則是一種將原對象完全複製到新的對象中的拷貝方法,適用於對嵌套列表及其他對象進行拷貝。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/293939.html