python的幾種拷貝方式的簡單介紹

本文目錄一覽:

Python中的賦值,淺拷貝和深拷貝的區別

賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變數都會影響到另一個。

淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}

深拷貝:創建一個新的對象,並且遞歸的複製它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數}

python深拷貝和淺拷貝的區別

淺拷貝是對一個對象父級(外層)的拷貝,並不會拷貝子級(內部),而深拷貝對一個對象是所有層次的拷貝(遞歸),內部和外部都會被拷貝過來。

使用淺拷貝的時候,分為兩種情況。

第一種,如果最外層的數據類型是可變的,比如說列表,字典等,淺拷貝會開啟新的地址空間去存放。

第二種,如果最外層的數據類型是不可變的,比如元組,字元串等,淺拷貝對象的時候,還是引用對象的地址空間。

深拷貝也分兩種情況:

第一種,最外層數據類型可變。這個時候,內部和外部的都會拷貝過來。

第二種,外層數據類型不可變,如果裡面是可變數據類型,會新開闢地址空間存放。如果內部數據類型不可變,才會如同淺拷貝一樣,是對地址的引用。

Python對象的拷貝

Python賦值操作或函數參數傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。

Python中一切皆對象,對象就像一個塑料盒子, 裡面裝的是數據。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作。現實生活中的”陶器”會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。

對象的類型還決定了它裝著的數據是允許被修改的變數(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想像成一個透明但封閉的盒子:你可以看到裡面裝的數據,但是無法改變它。類似地,可變對象就像一個開著口的盒子,你不僅可以看到裡面的數據,還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。

對象拷貝是指在內存中創建新的對象,產生新的內存地址。

淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。

2.1.1. 頂層是mutable,子元素全是immutable

當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, ‘world’, 2]

① 創建列表對象並賦值給變數a

② 導入copy模塊,使用copy.copy()函數淺拷貝a,並賦值給變數b

③ 修改變數a的子元素a[0] = 3,由於整數是不可變對象,所以並不是修改1變為3,而是更改a[0]指向對象3

當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, [‘hello’,’world’]]

① 淺拷貝 copy.copy() 只拷貝了頂層對象,沒有拷貝子元素對象[‘hello’,’world’],即a[2]和b[2]指向同一個列表對象

② 修改a[2][1] = ‘china’,則b[2][1] = ‘china’

當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)

變數a與變數b指向的是同一個元組對象,沒有拷貝

當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, [‘hello’,’world’])

變數a與變數b指向的是相同的元組對象,並且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]

深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象

當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, ‘world’, 2]

變數a與變數b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]

當頂層對象是mutable可變對象,但子元素也存在mutable可變對象時,如[1, 2, [‘hello’,’world’]]

深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字元串對象一樣),修改a[2][1] = ‘china’後,它重新指向了新的字元串對象(內存地址為140531581905808),不會影響到b[2][1]

當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)

變數a與變數b指向的是同一個元組對象,不存在拷貝

當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, [‘hello’,’world’])

變數a與變數b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]

使用=是賦值,即將列表對象的引用也賦值給變數b,可以將列表對象想像成一個盒子,變數a相當於這個盒子上的標籤,執行b = a後,相當於再在這個盒子上貼上b標籤,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用於雙方。

b/c/d都是a的複製,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當於淺拷貝的效果

使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當於淺拷貝的效果

同列表類似,可以使用字典的copy()函數或者轉換函數dict()

變數a與變數b/c指向不同的字典,但是沒有拷貝子元素,a[‘jobs’]和b[‘jobs’]/c[‘jobs’]指定同一個列表, 相當於淺拷貝的效果

同列表類似,可以使用集合的copy()函數或者轉換函數set()

變數a與變數b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c

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

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

相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    編程 2025-04-29

發表回復

登錄後才能評論