0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)述Python中深淺拷貝(copy)

馬哥Linux運(yùn)維 ? 來源:CSDN ? 作者:南枝向暖北枝寒 ? 2021-07-29 16:55 ? 次閱讀

在工作中,常涉及到數(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]

圖解:

913a8f9c-edff-11eb-a97a-12bb97331649.png

注意:l2 = l1是一個(gè)指向,是賦值,和深淺copy無關(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)存中是下面這樣的:

91dcdfcc-edff-11eb-a97a-12bb97331649.png

小結(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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078

原文標(biāo)題:圖解 Python 中深淺拷貝(copy)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python在AI的應(yīng)用實(shí)例

    Python在人工智能(AI)領(lǐng)域的應(yīng)用極為廣泛且深入,從基礎(chǔ)的數(shù)據(jù)處理、模型訓(xùn)練到高級(jí)的應(yīng)用部署,Python都扮演著至關(guān)重要的角色。以下將詳細(xì)探討Python在AI的幾個(gè)關(guān)鍵應(yīng)用
    的頭像 發(fā)表于 07-19 17:16 ?620次閱讀

    split在python的用法

    split在python的用法 split()是Python中一個(gè)非常常用的字符串函數(shù),它能夠根據(jù)指定的分隔符將一個(gè)字符串分割成多個(gè)子字符串,并返回一個(gè)包含這些子字符串的列表。本文將詳細(xì)介紹
    的頭像 發(fā)表于 12-25 15:12 ?1811次閱讀

    如何進(jìn)行零拷貝性能測(cè)試

    TogetherROS?·Bot零拷貝性能測(cè)試 我們使用TogetherROS?·Bot系統(tǒng)內(nèi)部集成的性能測(cè)試工具——performance_test,來評(píng)估下開啟零拷貝前后的性能差異,這里我們傳輸
    的頭像 發(fā)表于 11-27 16:51 ?341次閱讀
    如何進(jìn)行零<b class='flag-5'>拷貝</b>性能測(cè)試

    什么是零拷貝技術(shù)

    在傳統(tǒng)操作系統(tǒng)的數(shù)據(jù)傳輸過程,系統(tǒng)內(nèi)部會(huì)在磁盤、內(nèi)存、緩存多次進(jìn)行數(shù)據(jù)拷貝,每次都會(huì)占用CPU的資源,數(shù)據(jù)量小的時(shí)候還好。 隨著數(shù)據(jù)量的增加,CPU的開銷也會(huì)持續(xù)增加,尤其是在機(jī)器人圖像數(shù)據(jù)
    的頭像 發(fā)表于 11-27 16:20 ?377次閱讀
    什么是零<b class='flag-5'>拷貝</b>技術(shù)

    Python2與Python3的差異

    Python2,print語句是一個(gè)關(guān)鍵字,而在Python3,print函數(shù)被引入,必須使用括號(hào)。此外,Python3要求字符串必須使
    的頭像 發(fā)表于 11-23 16:48 ?710次閱讀

    pythontext的用法

    Python的text是一個(gè)常見的數(shù)據(jù)類型,它用于存儲(chǔ)和處理文本數(shù)據(jù)。在Python,文本常常被表示為字符串(string),字符串是一系列Unicode字符的有序序列。 在
    的頭像 發(fā)表于 11-23 15:46 ?2627次閱讀

    pycharmpython interpreter怎么設(shè)置

    在PyCharm設(shè)置Python解釋器非常簡(jiǎn)單,只需按照以下步驟操作: 打開PyCharm,并打開你的項(xiàng)目。 在菜單欄中選擇"File"(文件),然后選擇"Settings"(設(shè)置)。在
    的頭像 發(fā)表于 11-22 11:08 ?2562次閱讀

    pythonnumber代表什么

    Python,number(數(shù)字)是一種內(nèi)置的數(shù)據(jù)類型,用于表示數(shù)值。Python提供了幾種不同的number類型,分別是整數(shù)(int)、浮點(diǎn)數(shù)(float)、復(fù)數(shù)(complex)和布爾值
    的頭像 發(fā)表于 11-22 09:50 ?1458次閱讀

    Python如何表達(dá)復(fù)數(shù)

    Python,可以使用complex類型來表示和操作復(fù)數(shù)。復(fù)數(shù)是由一個(gè)實(shí)部和一個(gè)虛部組成的數(shù),可以使用下列格式來表示:real + imag*j,其中real是實(shí)部,imag是虛部。在
    的頭像 發(fā)表于 11-21 16:50 ?1806次閱讀

    pythontuple的用法

    Python的元組(tuple)是一種不可變的有序集合。與列表(list)類似,元組可以存儲(chǔ)任意類型的數(shù)據(jù),但是元組一旦創(chuàng)建就不能被修改。在Python,元組是使用圓括號(hào)進(jìn)行表示,
    的頭像 發(fā)表于 11-21 16:27 ?804次閱讀

    傳統(tǒng)IO演化至零拷貝的過程

    拷貝(Zero-Copy)用于在數(shù)據(jù)讀寫過程減少不需要的CPU拷貝,CPU就那么幾個(gè),減少它的負(fù)擔(dān)自然可以提高處理效率。數(shù)據(jù)傳輸有本地的文件拷貝
    的頭像 發(fā)表于 11-09 09:09 ?356次閱讀
    傳統(tǒng)IO演化至零<b class='flag-5'>拷貝</b>的過程

    怎么在Python實(shí)現(xiàn)截圖功能

    利用Python自帶的win32api和win32con、win32gui等模塊,我們能執(zhí)行許多windows下的自動(dòng)化操作。比如兩個(gè)窗口的自動(dòng)點(diǎn)擊操作,從軟件的窗口復(fù)制文本到txt,甚至是截圖
    的頭像 發(fā)表于 11-03 15:32 ?833次閱讀
    怎么在<b class='flag-5'>Python</b><b class='flag-5'>中</b>實(shí)現(xiàn)截圖功能

    Python拷貝與深拷貝的操作

    【例子】淺拷貝與深拷貝 list1 = [ 123 , 456 , 789 , 213 ]list2 = list1list3 = list1[:] print (list2) # [ 123
    的頭像 發(fā)表于 11-02 10:58 ?315次閱讀

    Python環(huán)境搭建和LabVIEW的調(diào)用

    本文主要介紹Python相關(guān)的環(huán)境搭建、Anaconda的使用以及在LabVIEW調(diào)用Python的方法。
    的頭像 發(fā)表于 10-13 17:56 ?2419次閱讀
    <b class='flag-5'>Python</b>環(huán)境搭建和LabVIEW<b class='flag-5'>中</b>的調(diào)用

    IAR下如何將程序拷貝在RAM運(yùn)行

    有時(shí)候我們需要將一部分程序從 FLASH 拷貝到 RAM 運(yùn)行,以提高程序運(yùn)行的速度。本文基于 IAREmbedded Workbench 列出了一些方法,可以在系統(tǒng)啟動(dòng)時(shí)自動(dòng)從 FLASH 中將
    發(fā)表于 09-28 06:50