深拷貝與淺拷貝:理解 Python 中的對象復制機制

深拷貝與淺拷貝:理解 Python 中的對象復制機制

在 Python 編程中,對象的復制是一個常見的操作。然而,很多初學者在處理對象復制時會遇到困惑,尤其是在涉及到復雜數據結構(如列表、字典、自定義對象等)時。今天,我們就來深入探討一下 Python 中的兩種主要的復制方式:淺拷貝深拷貝

1. 淺拷貝(Shallow Copy)

1.1 定義

淺拷貝是指創建一個新對象,但只復制原對象中的引用,而不復制引用所指向的實際對象。換句話說,淺拷貝只復制對象的第一層內容,而不會遞歸地復制嵌套的對象。

1.2 使用場景

在 Python 中,淺拷貝可以通過以下幾種方式實現:

  • 使用 copy 模塊的 copy() 函數。
  • 對于某些內置數據結構(如列表和字典),可以使用切片操作或構造函數來實現淺拷貝。

1.3 示例

import copy# 淺拷貝示例
original_list = [1, 2, 3, [4, 5]]
shallow_copied_list = copy.copy(original_list)# 打印地址
print("Original List Address:", id(original_list))
print("Shallow Copied List Address:", id(shallow_copied_list))
print("Original Nested List Address:", id(original_list[3]))
print("Shallow Copied Nested List Address:", id(shallow_copied_list[3]))# 修改嵌套列表
original_list[3][0] = 'A'print("After Modification:")
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

1.4 輸出

Original List Address: 14001234567890
Shallow Copied List Address: 14001234567891
Original Nested List Address: 14001234567893
Shallow Copied Nested List Address: 14001234567893
After Modification:
Original List: [1, 2, 3, ['A', 5]]
Shallow Copied List: [1, 2, 3, ['A', 5]]

1.5 分析

從輸出可以看出,修改嵌套列表時,淺拷貝的列表也發生了變化。這是因為淺拷貝只復制了第一層的引用,而嵌套的列表仍然指向同一個對象。具體來說:

  • original_listshallow_copied_list 的地址不同,說明它們是兩個不同的對象。
  • original_list[3]shallow_copied_list[3] 的地址相同,說明它們指向的是同一個嵌套列表。

2. 深拷貝(Deep Copy)

2.1 定義

深拷貝是指創建一個新對象,并遞歸地復制原對象中的所有嵌套對象。深拷貝會復制對象的所有層級,確保新對象與原對象完全獨立。

2.2 使用場景

在 Python 中,深拷貝可以通過 copy 模塊的 deepcopy() 函數實現。

2.3 示例

import copy# 深拷貝示例
original_list = [1, 2, 3, [4, 5]]
deep_copied_list = copy.deepcopy(original_list)# 打印地址
print("Original List Address:", id(original_list))
print("Deep Copied List Address:", id(deep_copied_list))
print("Original Nested List Address:", id(original_list[3]))
print("Deep Copied Nested List Address:", id(deep_copied_list[3]))# 修改嵌套列表
original_list[3][0] = 'A'print("After Modification:")
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

2.4 輸出

Original List Address: 14001234567890
Deep Copied List Address: 14001234567892
Original Nested List Address: 14001234567893
Deep Copied Nested List Address: 14001234567894
After Modification:
Original List: [1, 2, 3, ['A', 5]]
Deep Copied List: [1, 2, 3, [4, 5]]

2.5 分析

從輸出可以看出,修改嵌套列表時,深拷貝的列表保持不變。這是因為深拷貝遞歸地復制了所有嵌套對象,確保新對象與原對象完全獨立。具體來說:

  • original_listdeep_copied_list 的地址不同,說明它們是兩個不同的對象。
  • original_list[3]deep_copied_list[3] 的地址也不同,說明深拷貝遞歸地復制了嵌套列表,創建了一個完全獨立的新對象。

3. 淺拷貝與深拷貝的區別

3.1 內存占用

  • 淺拷貝:內存占用較小,因為它只復制第一層的引用。
  • 深拷貝:內存占用較大,因為它遞歸地復制所有嵌套對象。

3.2 性能

  • 淺拷貝:性能較好,因為只復制第一層的引用。
  • 深拷貝:性能較差,特別是對于復雜的嵌套對象,因為需要遞歸復制所有層級。

3.3 使用場景

  • 淺拷貝:適用于對象結構簡單(沒有嵌套對象)的場景。
  • 深拷貝:適用于對象結構復雜(有嵌套對象)的場景,需要確保新對象與原對象完全獨立。

4. 總結

在 Python 中,理解淺拷貝和深拷貝的區別非常重要。淺拷貝只復制第一層的引用,而深拷貝遞歸地復制所有嵌套對象。選擇合適的復制方式取決于你的具體需求。希望這篇文章能幫助你更好地理解淺拷貝和深拷貝的概念。如果有任何問題或建議,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

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

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

相關文章

BeanPostProcessor和AOP

BeanPostProcessor Spring中有一個接口Oredr的getOrder()方法,這個方法返回值是一個int類型,Spring容器會根據這個方法的返回值 對容器的多個Processor對象從小到大排序,創建Bean時候依次執行他們的方法,也就是說getOrder()方法的…

拒絕服務攻擊(DoS/DDoS/DRDoS)詳解:洪水猛獸的防御之道

在數字時代,服務的可用性是衡量一個在線系統成功與否的關鍵指標之一。然而,存在一類被稱為"拒絕服務攻擊" (Denial of Service, DoS) 的網絡攻擊,其主要目的就是通過各種手段耗盡目標服務器或網絡的資源,使其無法響應正…

小剛說C語言刷題—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X時n的值

1.題目描述 求恰好使 s11/21/3?1/n 的值大于 X 時 n 的值。( 2≤x≤10 ) 輸入 輸入只有一行,包括 1個整數 X 。 輸出 輸出只有一行(這意味著末尾有一個回車符號),包括 1 個整數。 樣例 輸入 2 輸出 4 2.參考代碼(C語言…

深度學習中的目標檢測:從 PR 曲線到 AP

深度學習中的目標檢測:從 PR 曲線到 AP 在目標檢測任務中,評估模型的性能是非常重要的。通過使用不同的評估指標和標準,我們可以量化模型的準確性與效果。今天我們將重點討論 PR 曲線(Precision-Recall Curve)、平均精…

MySQL 1366 - Incorrect string value:錯誤

MySQL 1366 - Incorrect string value:錯誤 錯誤如何發生發生原因: 解決方法第一種嘗試第二種嘗試 錯誤 如何發生 在給MySQL添加數據的時候發生了下面的錯誤 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…

[ctfshow web入門] web70

信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");讀取的index.php error_reporting和ini_set被禁用了,不必管他 error_reporting(0); ini_set(display_errors, 0); // 你們在炫技嗎? if(isset($_POST[c])){…

Linux在web下http加密和配置虛擬主機及動態頁面發布

web服務器的數據加密 1.簡介:由于http協議以明文方式發送,不提供任何方式的數據加密,也不適合傳輸一些重要的信息,如銀行卡號、密碼等,解決該缺陷設計了安全套接字層超文本傳輸協議https; 2.https的握手流…

uni-app,小程序中的addPhoneContact,保存聯系人到手機通訊錄

文章目錄 方法詳解簡介 基本語法參數說明基礎用法使用示例平臺差異說明注意事項最佳實踐 方法詳解 簡介 addPhoneContact是uni-app框架提供的一個實用API,用于向系統通訊錄添加聯系人信息。這個方法在需要將應用內的聯系人信息快速保存到用戶設備通訊錄的場景下非…

NHANES稀有指標推薦:HALP score

文章題目:Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI:10.3389/fonc.2024.1419310 中文標題:HALP 評分與無前列腺癌的中老年人血清…

【django.db.utils.OperationalError: unable to open database file】

解決platform.sh 環境下,無法打開數據庫問題 場景 在platform.sh 執行python manage.py createsuperuser是提示 django.db.utils.OperationalError: unable to open database file 錯誤 原因 由于settings.py文件中 本地數據庫配置在線上配置后,導致…

【前端分享】CSS實現3種翻頁效果類型,附源碼!

使用 css 可以實現多種翻頁效果&#xff0c;比如書本翻頁、卡片翻轉等。以下是兩種常見的翻頁效果實現&#xff1a; 效果 1&#xff1a;書本翻頁效果 通過 transform 和 rotateY 實現 3D 翻頁效果。 html 結構 <divclass"book"> <divclass"page pa…

【部署滿血Deepseek-R1/V3】大型語言模型部署實戰:多機多卡DeepSeek-R1配置指南

大家好&#xff01;這里是迪小莫學AI&#xff0c;今天的文章是“”大型語言模型部署實戰&#xff1a;多機多卡DeepSeek-R1配置指南“” 前言 隨著大型語言模型的快速發展&#xff0c;如何高效部署這些模型成為技術團隊面臨的重要挑戰。本文將分享基于DeepSeek-R1模型的多機多…

IPM IMI111T-026H 高效風扇控制板

概述&#xff1a; REF-MHA50WIMI111T 是一款專為風扇驅動設計的參考開發板&#xff0c;搭載了英飛凌的IMI111T-026H iMOTION?智能功率模塊(IPM)。這個模塊集成了運動控制引擎(MCE)、三相柵極驅動器和基于IGBT的功率級&#xff0c;全部封裝在一個緊湊的DSO22封裝中。REF-MHA50…

Linux 阻塞和非阻塞 I/O 簡明指南

目錄 聲明 1. 阻塞和非阻塞簡介 2. 等待隊列 2.1 等待隊列頭 2.2 等待隊列項 2.3 將隊列項添加/移除等待隊列頭 2.4 等待喚醒 2.5 等待事件 3. 輪詢 3.1 select函數 3.2 poll函數 3.3 epoll函數 4. Linux 驅動下的 poll 操作函數 聲明 本博客所記錄的關于正點原子…

互聯網SQL面試題:用戶會話時長分析

這是一個基于用戶點擊信息進行會話時長分析的案例&#xff0c;常見于互聯網 App 使用分析。 問題描述 用戶的訪問記錄存儲在 user_access 表中&#xff0c;包含用戶編號&#xff08;user_id&#xff09;以及訪問時間&#xff08;access_time&#xff09;等信息。以下是一個示…

前端取經路——現代API探索:沙僧的通靈法術

大家好,我是老十三,一名前端開發工程師。在現代Web開發中,各種強大的API就像沙僧的通靈法術,讓我們的應用具備了超乎想象的能力。本文將帶你探索從離線應用到實時通信,從多線程處理到3D渲染的九大現代Web API,讓你的應用獲得"通靈"般的超能力。 在前端取經的第…

window 顯示驅動開發-AGP 類型伸縮空間段

AGP 類型的伸縮空間段類似于線性光圈空間段。 但是&#xff0c;內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;不會通過 AGP 類型的伸縮空間段公開 dxgkDdiBuildPagingBuffer 回調函數的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMEN…

從零開始學習three.js(15):一文詳解three.js中的紋理映射UV

1. UV 映射基礎概念 1.1 什么是 UV 坐標&#xff1f; 在三維計算機圖形學中&#xff0c;UV 坐標是將二維紋理映射到三維模型表面的坐標系統。UV 中的 U 和 V 分別代表2D紋理空間的水平&#xff08;X&#xff09;和垂直&#xff08;Y&#xff09;坐標軸&#xff0c;與三維空間…

代碼復用與分層

1. 代碼復用與分層 函數&#xff1a;將常用的代碼塊封裝成函數&#xff0c;提供自己或者團隊使用。 庫&#xff1a;將代碼打包成靜態或者動態庫&#xff0c;提供出來一個頭文件供自己或者團隊使用。比如stm32中的HAL庫。 框架&#xff1a;通常實現一個完整的系統性的代碼&am…

人臉真假檢測:SVM 與 ResNet18 的實戰對比

在人工智能蓬勃發展的當下&#xff0c;人臉相關技術廣泛應用于安防、金融、娛樂等諸多領域。然而&#xff0c;隨著人臉合成技術的日益成熟&#xff0c;人臉真假檢測成為保障這些應用安全的關鍵環節。本文將深入探討基于支持向量機&#xff08;SVM&#xff09;結合局部二值模式&…