python淺拷貝 Python中的淺拷貝和深拷貝

2021-10-13 14:19:12 字數 3054 閱讀 8510

在python中,賦值語句不複製物件,它們只是在目標和物件之間建立繫結。當我們使用=運算子時,使用者認為這會建立乙個新物件;好吧,其實並沒有。它只建立乙個共享原始物件引用的新變數。有時使用者想要使用可變物件,為了做到這一點,使用者希望找到建立這些物件的「真實副本」或「轉殖」的方法。或者,有時使用者想要乙個可以被修改的副本而不會同時自動修改原件,為此,我們需要建立物件的副本。

拷貝在某些情況下是需要的,從而能讓我們在修改副本的同時不改動原始物件。在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()函式返回了乙個鍊錶的淺拷貝而deepcopy()函式返回了乙個鍊錶的深拷貝。

進行深拷貝時會遞迴地執行物件的拷貝過程。這意味著它首先建立乙個新的集合物件,然後遞迴地使用原始物件中所有子物件的拷貝來填充這個新的集合物件。在深拷貝中,乙個物件會被完整地複製到另乙個物件中。這意味著發生在新物件中的所有修改都不會影響到原始物件。觀察下面的**:

# 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=" ")

output:

the original elements before deep copying

1 2 [3, 5] 4

the new list of elements after deep copying

1 2 [7, 5] 4

the original elements after deep copying

1 2 [3, 5] 4

在上面的例子中,在新的鍊錶中發生的修改並不會反映在原始的鍊錶中,表明這是乙個深拷貝的操作。

乙個淺拷貝意味著建立乙個新的集合物件並用原始物件中子物件的引用來填充新物件。拷貝的過程並不是遞迴的,因此不會建立子物件的拷貝。對於淺拷貝來說,是在另乙個物件中建立了物件的引用。這意味著對新物件採取的所有修改也會同時影響原來的物件。比如:

# 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=" ")

output:

the original elements before shallow copying

1 2 [3, 5] 4

the original elements after shallow copying

1 2 [7, 5] 4

在上例中,在新的鍊錶中的修改使得原始鍊錶也被同時修改了,表明這是乙個淺拷貝操作。

注意事項:

淺拷貝和深拷貝之間的區別僅與復合物件有關(指那些本身包含了其他物件的物件,比如鍊錶或者類的例項):淺拷貝構造乙個新的復合物件,然後(盡可能)將對它的引用插入到原始物件中。

深拷貝構造乙個新的復合物件,然後遞迴地將複製物件插入到原始物件中找到的物件中。

2019-03-17

python 淺拷貝 深拷貝

直接賦值 其實就是物件的引用 別名 淺拷貝 copy 拷貝父物件,不會拷貝物件的內部的子物件。深拷貝 deepcopy copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。usr bin python import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物...

python深拷貝 淺拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 alist 1,2,3,...

python 深拷貝 淺拷貝

淺拷貝是對於乙個物件的頂層拷貝 通俗的理解是 拷貝了引用,並沒有拷貝內容 深拷貝是對於乙個物件所有層次的拷貝 遞迴 拷貝字典 值相當於鍵的引用 所以copy.copy 為淺拷貝 淺拷貝對不可變型別和可變型別的copy不同 copy.copy對於可變型別,會進行淺拷貝 copy.copy對於不可變型別...