Python 中的淺拷貝和深拷貝

在本教程中,我們將學習如何使用 Python 腳本創建淺拷貝和深拷貝。通常,我們使用=(賦值操作符)來創建 Python 對象的副本。讓我們理解與用 Python 創建副本相關的完整概念。

眾所周知,賦值運算符用於創建 Python 對象的副本,但這不是真的;它只創建目標和對象之間的綁定。當我們使用賦值操作符時,它不是創建一個新對象,而是創建一個共享舊對象引用的新變數。

當用戶希望在不修改原始對象的情況下進行更改時,副本很有幫助。用戶還喜歡創建一個副本來處理可變對象。

讓我們理解下面的例子。

示例-


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

list2[1][2] = 4

print('Old List:', list1)
print('ID of Old List:', id(list1))

print('New List:', list2)
print('ID of New List:', id(list2))

輸出:

Old List: [[1, 2, 3], [4, 5, 4], [7, 8, 'a']]
ID of Old List: 1909447368968
New List: [[1, 2, 3], [4, 5, 4], [7, 8, 'a']]
ID of New List: 1909447368968

解釋-

在上面的輸出中,我們可以看到變數 list1 和 list2 共享同一個 id 1909447368968。

如果我們對列表 1 或列表 2 中的任何值進行任何更改,更改將反映在兩者中。

主要動機是創建一個 Python 對象的副本,我們可以在不改變原始數據的情況下修改副本。在 Python 中,有兩種方法可以創建副本。

  • 淺拷貝
  • 深度複製

我們將使用複製模塊來創建上述副本。

拷貝模塊用於創建淺拷貝和深拷貝。讓我們看看每種方法。

淺拷貝是存儲原始元素引用的對象的拷貝。它創建新的集合對象,然後使用在原始集合中找到的子對象來佔據它。

它複製嵌套對象的引用,但不創建嵌套對象的副本。所以如果我們對複製的對象做任何修改都會反映在原始對象中。我們將使用 copy() 函數來實現它。

示例-


# importing "copy" for copy operations 
import copy 

# initializing list 1 
list1 = [1, 7, [3,5], 8] 

# using copy to shallow copy 
list2 = copy.copy(list1) 

# original elements of list 
print ("The original elements before shallow copying") 
for i in range(0,len(list1)): 
   print (list1[i],end=" ") 

print("\r") 

# adding and element to new list 
list2[2][0] = 10

# checking if change is reflected 
print ("The original elements after shallow copying") 
for i in range(0,len( list1)): 
   print (list1[i],end=" ") 

輸出:

The original elements before shallow copying
1 7 [3, 5] 8 
The original elements after shallow copying
1 7 [10, 5] 8

在上面的代碼中,我們在列表 1 中製造了反映在另一個列表中的機會。

示例- 2


import copy

list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
list2 = copy.copy(list1)

list1.append([13, 14,15])

print("Old list:", list1)
print("New list:", list2)

輸出:

Old list: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
New list: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

解釋-

在上面的代碼中,我們創建了 list1 的一個淺拷貝。新創建的列表 2 包含對存儲在列表 1 中的原始嵌套對象的引用。然後,我們將[13,14,15]追加到舊列表中,並且在新列表中不複製子列表。

深度複製是我們創建一個新對象並遞歸添加複製元素的過程。我們將使用複製模塊中的 deecopy() 方法。創建原始對象及其整個對象的獨立副本。讓我們理解下面的例子。

示例-


import copy
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
z = copy.deepcopy(xs)
print(x)
prin(z)

輸出:

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

解釋-

在上面的輸出中,我們可以看到 z 是我們使用 deecopy() 方法創建的 x 的克隆。如果我們對其中一個子對象進行更改,不會影響原始對象。

這兩個對象在深度副本中都是完全獨立的。列表 x 被遞歸克隆,包括它的所有子對象。


import copy
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
z = copy.deepcopy(x)

x[2][2] = 'Hello'
print(x)

示例- 2:


import copy 

list1 = [0, [1, 2], [3,5], 4] 

# using deepcopy to deep copy 
list2 = copy.deepcopy(list1) 

# original elements of list 
print ("The original list: ")
for i in range(0,len(list1)): 
   print (list1[i],end=" ") 

print("\r") 

# adding and element to new list 
list2[1][0] = 8

# Change is reflected in l2 
print ("The new list after deep copying: ")
for i in range(0,len( list1)): 
   print (list2[i],end=" ") 

print("\r") 

# Change is NOT reflected in original list 
# as it is a deep copy 
print ("The original elements:")
for i in range(0,len( list1)): 
   print (list1[i],end=" ") 

輸出:

The original list: 
0 [1, 2] [3, 5] 4 
The new list after deep copying: 
0 [8, 2] [3, 5] 4 
The original elements:
0 [1, 2] [3, 5] 4

我們還可以使用複製方法複製任意 Python 對象,包括自定義類。可以使用 copy.copy() 和 copy.deepcopy() 方法複製任何對象。

讓我們理解下面的例子。

示例-


import copy
class Func_New:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
      return 'Func_new(%r, %r)' % (self.x, self.y)

a = Func_New(50, 56)
b = copy.copy(a)

print(a)
print(b)

print(a is b)
print(b is a)

輸出:

Func_new(50, 56)
Func_new(50, 56)
False
False

解釋-

在上面的代碼中,我們創建了一個名為 Func_new 的用戶定義類,並定義了 repr() 來檢查對象。接下來,我們使用複製模塊創建了淺層副本。我們實例化該類,並檢查原始的和它的淺拷貝是否都是。

複合對象是淺拷貝和深拷貝的主要區別。包含其他對象(如列表或類實例)的對象稱為列表或類實例。

  • 淺拷貝會創建一個新的複合對象,然後添加對原始對象的引用。

  • 深度複製會創建一個新的複合對象,然後添加對原始對象的引用。

  • 我們可以用複製模塊複製任意對象(包括自定義類)。

原創文章,作者:EBWSB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/126647.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EBWSB的頭像EBWSB
上一篇 2024-10-03 23:09
下一篇 2024-10-03 23:09

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論