在工作中,常涉及到數據的傳遞,在數據傳遞使用過程中,可能會發生數據被修改的問題。為了防止數據被修改,就需要在傳遞一個副本,即使副本被修改,也不會影響原數據的使用。為了生成這個副本,就產生了拷貝。今天就說一下Python中的深淺拷貝問題。
一、深淺copy
賦值運算
l1 = [1, 2, 3, [22, 33]]l2 = l1l1.append(666)print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33], 666]
圖解:

注意:l2 = l1是一個指向,是賦值,和深淺copy無關。
淺copy
其實列表是一個一個的槽位,每個槽位存儲的是該對象的內存地址
#例1. 給大列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()# 或者下面這種方式,也是淺copy# import copy# l2 = copy.copy(l1)l1.append(666)
print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33]]
#例2. 給小列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[-1].append(666)
print(l1) # [1, 2, 3, [22, 33, 666]]print(l2) # [1, 2, 3, [22, 33, 666]]、
例3. 將l1列表中第一個元素改為6l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[0] = 6
print(l1) # [6, 2, 3, [22, 33]]print(l2) # [1, 2, 3, [22, 33]]
小結:
淺copy:會在內存中新開辟一個空間,存放這個copy的列表,但是列表里面的內容還是沿用之前對象的內存地址。
深copy
import copyl1 = [1, 2, 3, [22, 33]]l2 = copy.deepcopy(l1)l1.append(666)print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33]]
但是python對深copy做了一個優化,將可變的數據類型在內存中重新創建一份,而不可變的數據類型則沿用之前的,所以內存中是下面這樣的:

小結:
深copy:會在內存中開辟新空間,將原列表以及列表里面的可變數據類型重新創建一份,不可變數據類型則沿用之前的。
為什么Python默認的拷貝方式是淺拷貝?
時間角度:淺拷貝花費時間更少。
空間角度:淺拷貝花費內存更少。
效率角度:淺拷貝只拷貝頂層數據,一般情況下比深拷貝效率高。
總結:
不可變對象在賦值時會開辟新空間。
可變對象在賦值時,修改一個的值,另一個也會發生改變。
深、淺拷貝對不可變對象拷貝時,不開辟新空間,相當于賦值操作。
淺拷貝在拷貝時,只拷貝第一層中的引用,如果元素是可變對象,并且被修改,那么拷貝的對象也會發生變化。
深拷貝在拷貝時,會逐層進行拷貝,直到所有的引用都是不可變對象為止。
Python 有多種方式實現淺拷貝,copy模塊的copy 函數 ,對象的 copy 函數 ,工廠方法,切片等。
大多數情況下,編寫程序時,都是使用淺拷貝,除非有特定的需求。
淺拷貝的優點:拷貝速度快,占用空間少,拷貝效率高。
原文鏈接:https://blog.csdn.net/mall_lucy/article/details/104531218
文章轉載:CSDN
(版權歸原作者所有,侵刪)
編輯:jq
-
python
+關注
關注
57文章
4876瀏覽量
90025
原文標題:圖解 Python 中深淺拷貝(copy)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
內存拷貝函數 memcpy原理及實現
Termux中調試圣誕樹Python代碼
linux虛擬環境中調用Linux 版matlab編譯的python庫時出錯
基礎篇3:掌握Python中的條件語句與循環
使用串口dma環形接收+空閑中斷,觸發空閑中斷后進入任務中拷貝數據發現拷貝的數據全為0,怎么處理?
零基礎入門:如何在樹莓派上編寫和運行Python程序?
嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之獲取用戶空間數據
嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之獲取內核空間數據
飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之獲取用戶空間數據
嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之數據拷貝介紹
飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之獲取內核空間數據
Python在嵌入式系統中的應用場景
飛凌嵌入式ElfBoard ELF 1板卡-內核空間與用戶空間的數據拷貝之數據拷貝介紹
USB3.0移動硬盤拷貝機 如何選 ?
簡述Python中深淺拷貝(copy)
評論