在工作中,常涉及到數(shù)據(jù)的傳遞,在數(shù)據(jù)傳遞使用過程中,可能會(huì)發(fā)生數(shù)據(jù)被修改的問題。為了防止數(shù)據(jù)被修改,就需要在傳遞一個(gè)副本,即使副本被修改,也不會(huì)影響原數(shù)據(jù)的使用。為了生成這個(gè)副本,就產(chǎn)生了拷貝。今天就說一下Python中的深淺拷貝問題。
一、深淺copy
賦值運(yùn)算
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是一個(gè)指向,是賦值,和深淺copy無(wú)關(guān)。
淺copy
其實(shí)列表是一個(gè)一個(gè)的槽位,每個(gè)槽位存儲(chǔ)的是該對(duì)象的內(nèi)存地址
#例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列表中第一個(gè)元素改為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]]
小結(jié):
淺copy:會(huì)在內(nèi)存中新開辟一個(gè)空間,存放這個(gè)copy的列表,但是列表里面的內(nèi)容還是沿用之前對(duì)象的內(nèi)存地址。
深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對(duì)深copy做了一個(gè)優(yōu)化,將可變的數(shù)據(jù)類型在內(nèi)存中重新創(chuàng)建一份,而不可變的數(shù)據(jù)類型則沿用之前的,所以內(nèi)存中是下面這樣的:
小結(jié):
深copy:會(huì)在內(nèi)存中開辟新空間,將原列表以及列表里面的可變數(shù)據(jù)類型重新創(chuàng)建一份,不可變數(shù)據(jù)類型則沿用之前的。
為什么Python默認(rèn)的拷貝方式是淺拷貝?
時(shí)間角度:淺拷貝花費(fèi)時(shí)間更少。
空間角度:淺拷貝花費(fèi)內(nèi)存更少。
效率角度:淺拷貝只拷貝頂層數(shù)據(jù),一般情況下比深拷貝效率高。
總結(jié):
不可變對(duì)象在賦值時(shí)會(huì)開辟新空間。
可變對(duì)象在賦值時(shí),修改一個(gè)的值,另一個(gè)也會(huì)發(fā)生改變。
深、淺拷貝對(duì)不可變對(duì)象拷貝時(shí),不開辟新空間,相當(dāng)于賦值操作。
淺拷貝在拷貝時(shí),只拷貝第一層中的引用,如果元素是可變對(duì)象,并且被修改,那么拷貝的對(duì)象也會(huì)發(fā)生變化。
深拷貝在拷貝時(shí),會(huì)逐層進(jìn)行拷貝,直到所有的引用都是不可變對(duì)象為止。
Python 有多種方式實(shí)現(xiàn)淺拷貝,copy模塊的copy 函數(shù) ,對(duì)象的 copy 函數(shù) ,工廠方法,切片等。
大多數(shù)情況下,編寫程序時(shí),都是使用淺拷貝,除非有特定的需求。
淺拷貝的優(yōu)點(diǎn):拷貝速度快,占用空間少,拷貝效率高。
原文鏈接:https://blog.csdn.net/mall_lucy/article/details/104531218
文章轉(zhuǎn)載:CSDN
(版權(quán)歸原作者所有,侵刪)
編輯:jq
-
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86268
原文標(biāo)題:圖解 Python 中深淺拷貝(copy)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用串口dma環(huán)形接收+空閑中斷,觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,怎么處理?
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之獲取內(nèi)核空間數(shù)據(jù)
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹
飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之獲取內(nèi)核空間數(shù)據(jù)
飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹
四頻拷貝遙控器走俏海外

M.2硬盤拷貝,該怎么選擇適合的工具?FPGA拷貝機(jī)到底有沒有用?

批量音頻檔案拷貝最佳方案:解決播放錯(cuò)誤與拷貝不完全問題

Python中多線程和多進(jìn)程的區(qū)別

評(píng)論