Python中的深拷貝與淺拷貝:深入解析與實用指南

Python中的深拷貝與淺拷貝:深入解析與實用指南

一、引言

在Python編程中,我們經常需要復制對象,但有時候僅僅復制對象的引用是不夠的,我們需要的是對象的真實副本。此時,我們就需要考慮使用深拷貝或淺拷貝。深拷貝和淺拷貝是Python中兩種常見的對象復制方式,它們之間的主要區別在于復制的深度和方式。本文將詳細解析深拷貝和淺拷貝的概念、原理、區別以及應用場景,幫助讀者更好地理解和使用這兩種復制方式。

二、淺拷貝(Shallow Copy)

淺拷貝,也被稱為淺復制或對象復制,是Python中對象復制的一種基本方式。在淺拷貝中,對于非容器類型(如整數、浮點數、字符串等)的對象,直接復制其值;而對于容器類型(如列表、字典、元組、集合等)的對象,只復制容器本身,而不復制容器內的對象。換句話說,淺拷貝只復制一層,如果容器內嵌套了其他容器,那么這些嵌套的容器只是被引用,而不是被復制。

在Python中,可以使用copy模塊中的copy()函數或者切片操作(對于列表和元組)來實現淺拷貝。以下是一個使用copy()函數進行淺拷貝的示例:

import copy# 原始列表
original_list = [1, 2, [3, 4], 5]# 淺拷貝列表
shallow_copy_list = copy.copy(original_list)# 修改淺拷貝列表中的嵌套列表
shallow_copy_list[2][0] = 'a'# 輸出原始列表和淺拷貝列表
print("Original List:", original_list)  # 輸出: [1, 2, ['a', 4], 5]
print("Shallow Copy List:", shallow_copy_list)  # 輸出: [1, 2, ['a', 4], 5]

從上面的示例可以看出,當我們修改淺拷貝列表中的嵌套列表時,原始列表中的對應嵌套列表也被修改了。這是因為淺拷貝只復制了最外層的容器,而沒有復制嵌套容器及其內部的對象。

三、深拷貝(Deep Copy)

深拷貝,也被稱為深度復制或完全復制,是Python中對象復制的另一種方式。在深拷貝中,對于非容器類型的對象,直接復制其值;而對于容器類型的對象,不僅復制容器本身,還遞歸地復制容器內的所有對象(包括嵌套容器及其內部的對象)。換句話說,深拷貝會復制對象的所有層次,直到最底層的基本數據類型。

在Python中,可以使用copy模塊中的deepcopy()函數來實現深拷貝。以下是一個使用deepcopy()函數進行深拷貝的示例:

import copy# 原始列表
original_list = [1, 2, [3, 4], 5]# 深拷貝列表
deep_copy_list = copy.deepcopy(original_list)# 修改深拷貝列表中的嵌套列表
deep_copy_list[2][0] = 'a'# 輸出原始列表和深拷貝列表
print("Original List:", original_list)  # 輸出: [1, 2, [3, 4], 5]
print("Deep Copy List:", deep_copy_list)  # 輸出: [1, 2, ['a', 4], 5]

從上面的示例可以看出,當我們修改深拷貝列表中的嵌套列表時,原始列表并沒有受到影響。這是因為深拷貝遞歸地復制了所有層次的對象,包括嵌套容器及其內部的對象。

四、深拷貝與淺拷貝的區別

深拷貝和淺拷貝的主要區別在于復制的深度和方式。淺拷貝只復制最外層的容器和容器內的非容器對象,而容器內的容器對象只是被引用,而不是被復制。因此,當修改淺拷貝中的嵌套容器時,原始對象也會受到影響。而深拷貝則遞歸地復制所有層次的對象,包括嵌套容器及其內部的對象。因此,修改深拷貝中的對象不會影響原始對象。

另外,需要注意的是,由于深拷貝需要遞歸地復制所有層次的對象,因此它通常比淺拷貝更耗時和更耗內存。因此,在選擇使用深拷貝還是淺拷貝時,需要根據具體的應用場景和需求進行權衡。

五、應用場景

  1. 淺拷貝的應用場景:當只需要復制最外層的容器和容器內的非容器對象時,可以使用淺拷貝。例如,當處理不包含嵌套容器的列表或字典時,淺拷貝是一種簡單而高效的方式。

  2. 深拷貝的應用場景:當需要復制所有層次的對象,包括嵌套容器及其內部的對象時,應該使用深拷貝。例如,在處理包含嵌套容器(如列表的列表、字典的字典等)的復雜數據結構時,深拷貝能夠確保復制出的新對象與原對象完全獨立,互不干擾。

六、深拷貝與淺拷貝的注意事項

  1. 不可變對象:對于不可變對象(如數字、字符串、元組等),由于它們本身的值不能被修改,因此無論是深拷貝還是淺拷貝,結果都是相同的。也就是說,對于這些對象,我們無需擔心拷貝后的修改會影響原始數據。
  2. 內存和性能:如上所述,深拷貝需要遞歸地復制所有層次的對象,因此通常比淺拷貝更耗時和更耗內存。在處理大型數據結構時,這可能會成為一個問題。因此,在選擇使用深拷貝還是淺拷貝時,需要根據具體的應用場景和需求進行權衡。
  3. 循環引用:在某些情況下,對象之間可能存在循環引用(即一個對象直接或間接地引用了自己)。在進行深拷貝時,這種循環引用可能會導致問題,因為深拷貝會不斷地遞歸復制對象,直到達到最底層的基本數據類型。如果在這個過程中遇到了已經復制過的對象,就可能會導致無限遞歸或內存溢出。因此,在使用深拷貝時,需要特別注意循環引用的問題。

七、總結

深拷貝和淺拷貝是Python中兩種常見的對象復制方式,它們的主要區別在于復制的深度和方式。淺拷貝只復制最外層的容器和容器內的非容器對象,而深拷貝則遞歸地復制所有層次的對象。在選擇使用深拷貝還是淺拷貝時,需要根據具體的應用場景和需求進行權衡。同時,還需要注意不可變對象、內存和性能以及循環引用等問題。希望本文能夠幫助讀者更好地理解和使用Python中的深拷貝和淺拷貝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15769.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPT-2添加PAD token

GPT-2和GPT-3模型(包括其他類似系列)通常沒有內置的PAD token,因為它們主要用于生成任務,而這些任務通常不需要填充。然而,在一些特定任務(如批量處理或序列對齊)中,添加PAD token是…

翻譯《The Old New Thing》- What‘s the deal with the EM_SETHILITE message?

Whats the deal with the EM_SETHILITE message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071025-00/?p24693 Raymond Chen 2007年10月25日 簡要 文章討論了EM_SETHILITE和EM_GETHILITE消息在文檔中顯示為“未實現”的原因。這些…

前端 JS 經典:Web 性能指標

什么是性能指標:Web Performance Metrics 翻譯成 Web 性能指標,一般和時間有關系,在短時間內做更多有意義的事情。 一個站點表現得好與不好,標準在于用戶體驗,而用戶體驗好不好,有一套 RAIL 模型來衡量。這…

大專學歷java能找到工作嗎

就低學歷就業的情況,大專學歷的職業上限基本上是中小公司的開發小組長,中專或同等學歷的職業上限一般是軟件小作坊的項目經理。當下大專學歷能進大公司的可能性不能說沒,但相比前幾年,少了太多。有穩定業務渠道的軟件公司&#xf…

Vue.js功能實現博客

Vue.js功能實現博客 一、前言 Vue.js 是一款構建用戶界面的漸進式框架。今天我們將通過一個簡單的示例來展示如何使用 Vue.js 創建一個簡單的計數器功能,并在此過程中解釋每個步驟。 二、環境準備 在開始之前,請確保你的開發環境中已經安裝了 Node.j…

音視頻學習規劃

文章目錄 概述閑聊點 小結 概述 最近在學習音視頻,覺得還是要先寫個提綱,給自己制定下學習路線及目標。先寫下我的個人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒體RTMP,HLS 閑聊點 先說下學習命令行吧,學習命令行是為了…

GitHub的原理及應用詳解(六)

本系列文章簡介: GitHub是一個基于Git版本控制系統的代碼托管平臺,為開發者提供了一個方便的協作和版本管理的工具。它廣泛應用于軟件開發項目中,包括但不限于代碼托管、協作開發、版本控制、錯誤追蹤、持續集成等方面。 GitHub的原理可以簡單…

Spring Cloud 項目在網關聚合 Swagger 文檔

文章目錄 Spring Cloud 項目在網關聚合 Swagger 文檔各個微服務的改動改動一:新增依賴改動二:新增配置類關鍵項說明 Gateway 的改動改動一:新增依賴改動二:新增配置類和處理類改動三:改動配置文件 Spring Cloud 項目在…

一千題,No.0026(Ternary String)

描述 You are given a string s such that each its character is either 1, 2, or 3. You have to choose the shortest contiguous substring of s such that it contains each of these three characters at least once. A contiguous substring of string s is a string …

Python3 筆記:IDLE的幾個基本設置

1、設置字體: Options > Configure IDLE > Fonts 2、設置文字顏色(設置高亮): Options > Configure IDLE > Highlights 3、設置背景顏色: Options > Configure IDLE > Highlights 4、設置窗口&a…

各位數字和-第13屆藍橋杯選拔賽Python真題精選

[導讀]:超平老師的Scratch藍橋杯真題解讀系列在推出之后,受到了廣大老師和家長的好評,非常感謝各位的認可和厚愛。作為回饋,超平老師計劃推出《Python藍橋杯真題解析100講》,這是解讀系列的第72講。 各位數字和&#…

MongoDB(介紹,安裝,操作,Springboot整合MonggoDB)

目錄 MongoDB 1 MongoDB介紹 MongoDB簡介 MongoDB的特點 MongoDB使用場景 小結 2 MongoDB安裝 安裝MongoDB 連接MongoDB MongoDB邏輯結構 MongoDB數據類型 小結 3 MongoDB操作 操作庫和集合 操作文檔-增刪改 操作文檔-查詢 MongoDB索引 小結 4 SpringBoot整合…

c# sqlite使用

安裝包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…

ES 查詢踩坑-全字段匹配

需求:name字段需要全匹配查詢 name的映射 普通的must查詢 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

刷題之路徑總和Ⅲ(leetcode)

路徑總和Ⅲ 這題和和《為K的數組》思路一致&#xff0c;也是用前綴表。 代碼調試過&#xff0c;所以還加一部分用前序遍歷數組和中序遍歷數組構造二叉樹的代碼。 #include<vector> #include<unordered_map> #include<iostream> using namespace std; //Def…

python從入門到精通01

一、程序員計算器 number int(input("請輸入一個數字&#xff1a;")) print("二進制",bin(number)) print("八進制",oct(number)) print("十六進制",hex(number))二、給電影打分 score int(input("請給電影《肖申克的救贖》打…

計算機畢業設計Hadoop+Hive地震預測系統 地震數據分析可視化 地震爬蟲 大數據畢業設計 Spark 機器學習 深度學習 Flink 大數據

2024 屆本科畢業論文&#xff08;設計&#xff09; 基于Hadoop的地震預測的 分析與可視化研究 姓 名&#xff1a;____田偉情_________ 系 別&#xff1a;____信息技術學院___ 專 業&#xff1a;數據科學與大數據技術 學 號&#xff1a;__2011103094________ 指導…

【大數據面試題】33 Flink SQL做過哪些優化?

一步一個腳印&#xff0c;一天一道面試題 簡單寫幾個 Flink SQL 的優化 1.優化狀態管理 Flink 的狀態管理對整個程序的性能有較大影響。所以優化效果比較好。 設置空閑狀態自動清理&#xff08;TTL Time-to-Live&#xff09;數據量大時選擇 RocksDBStateBackend // 設置狀…

《圖解支付系統設計與實現》電子書_V20240525

相較于上次公開發布的V20240503版本&#xff0c;變更內容如下&#xff1a; 根據掘金網友zz67373&#xff08;李浩銘&#xff09;的勘誤建議&#xff0c;優化了部分描述。增加&#xff1a;金額處理規范&#xff0c;低代碼報文網關實現完整代碼&#xff0c;分布式流控等內容。擴…

Java虛擬機原理(下)-Dalvik vs ART-探秘Android虛擬機內在機制

Android系統作為移動端主流平臺&#xff0c;其高效的虛擬機無疑是其核心競爭力之一。今天&#xff0c;就讓我們一起剝開Dalvik和ART虛擬機的外衣&#xff0c;深入解析它們的工作原理和優缺點&#xff0c;幫助你全面把握Android系統的運行機制。 正文導覽 Dalvik和ART虛擬機的發…