最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?copy()與deepcopy()方法之間有什么區(qū)別

 更新時(shí)間:2022年10月12日 17:14:18   作者:Python熱愛者  
這篇文章主要介紹了Python中的copy()和deepcopy(),下面詳細(xì)介紹該內(nèi)容并附上詳細(xì)代碼,需要的朋友可以參考一下文章的具體內(nèi)容,希望對(duì)你有所幫助

前言

copy()與deepcopy()之間的區(qū)分必須要涉及到python對(duì)于數(shù)據(jù)的存儲(chǔ)方式。

首先直接上結(jié)論:

  • 我們尋常意義的復(fù)制就是深復(fù)制,即將被復(fù)制對(duì)象完全再?gòu)?fù)制一遍作為獨(dú)立的新個(gè)體單獨(dú)存在。所以改變?cè)斜粡?fù)制對(duì)象不會(huì)對(duì)已經(jīng)復(fù)制出來(lái)的新對(duì)象產(chǎn)生影響。
  • 而淺復(fù)制并不會(huì)產(chǎn)生一個(gè)獨(dú)立的對(duì)象單獨(dú)存在,他只是將原有的數(shù)據(jù)塊打上一個(gè)新標(biāo)簽,所以當(dāng)其中一個(gè)標(biāo)簽被改變的時(shí)候,數(shù)據(jù)塊就會(huì)發(fā)生變化,另一個(gè)標(biāo)簽也會(huì)隨之改變。這就和我們尋常意義上的復(fù)制有所不同了。

對(duì)于簡(jiǎn)單的 object,用 shallow copy 和 deep copy 沒區(qū)別

復(fù)雜的 object, 如 list 中套著 list 的情況,shallow copy 中的 子list,并未從原 object 真的「獨(dú)立」出來(lái)。也就是說,如果你改變?cè)?object 的子 list 中的一個(gè)元素,你的 copy 就會(huì)跟著一起變。這跟我們直覺上對(duì)「復(fù)制」的理解不同。

看不懂文字沒關(guān)系我們來(lái)看代碼:

>>> import copy
>>> origin = [1,2,[3,4]]
#origin里邊有三個(gè)元素:1,2,[3,4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>>cop1 is cop2
False
#cop1和cop2看上去相同,但已不再是同一個(gè)object
>>> origin[2][0] = "hey!"
>>> origin
[1,2,['hey!',4]]
>>>cop1
[1,2,['hey!', 4]]
>>> cop2
[1,2,[3,4]]
#把origin內(nèi)的子list [3,4]改掉了一個(gè)元素,觀察cop1和cop2

可以看到 cop1,也就是 shallow copy 跟著 origin 改變了。而 cop2 ,也就是 deep copy 并沒有變。

似乎 deep copy 更加符合我們對(duì)「復(fù)制」的直覺定義: 一旦復(fù)制出來(lái)了,就應(yīng)該是獨(dú)立的了。如果我們想要的是一個(gè)字面意義的「copy」,那就直接用 deep_copy 即可。

那么為什么會(huì)有 shallow copy 這樣的「假」 copy 存在呢? 這就是有意思的地方了。

python的數(shù)據(jù)存儲(chǔ)方式

Python 存儲(chǔ)變量的方法跟其他 OOP 語(yǔ)言不同。它與其說是把值賦給變量,不如說是給變量建立了一個(gè)到具體值的 reference。

當(dāng)在 Python 中 a = something 應(yīng)該理解為給 something 貼上了一個(gè)標(biāo)簽 a。當(dāng)再賦值給 a 的時(shí)候,就好象把 a 這個(gè)標(biāo)簽從原來(lái)的 something 上拿下來(lái),貼到其他對(duì)象上,建立新的 reference。 這就解釋了一些 Python 中可能遇到的詭異情況:

>>> a = [1,2,3]
>>> b = a
>>> a = [4,5,6] #賦新的值給a
>>> a
[4,5,6]
>>> b
[1,2,3]
# a 的值改變后,b并沒有隨著a變
>>> a = [1,2,3]
>>> b = a
>>> a[0],a[1],a[2] = 4,5,6 #改變?cè)瓉?lái)list中的元素
>>> a
[4,5,6]
>>> b
[4,5,6]
# a 的值改變后, b 隨著 a 變了

上面兩段代碼中,a 的值都發(fā)生了變化。區(qū)別在于,第一段代碼中是直接賦給了 a 新的值(從 [1, 2, 3] 變?yōu)?[4, 5, 6]);而第二段則是把 list 中每個(gè)元素分別改變。

而對(duì) b 的影響則是不同的,一個(gè)沒有讓 b 的值發(fā)生改變,另一個(gè)變了。怎么用上邊的道理來(lái)解釋這個(gè)詭異的不同呢?

首次把 [1, 2, 3] 看成一個(gè)物品。a = [1, 2, 3] 就相當(dāng)于給這個(gè)物品上貼上 a 這個(gè)標(biāo)簽。而 b = a 就是給這個(gè)物品又貼上了一個(gè) b 的標(biāo)簽。

第一種情況:

a = [4, 5, 6] 就相當(dāng)于把 a 標(biāo)簽從 [1 ,2, 3] 上撕下來(lái),貼到了 [4, 5, 6] 上。

在這個(gè)過程中,[1, 2, 3] 這個(gè)物品并沒有消失。 b 自始至終都好好的貼在 [1, 2, 3] 上,既然這個(gè) reference 也沒有改變過。 b 的值自然不變。

第二種情況:

a[0], a[1], a[2] = 4, 5, 6 則是直接改變了 [1, 2, 3] 這個(gè)物品本身。把它內(nèi)部的每一部分都重新改裝了一下。內(nèi)部改裝完畢后,[1, 2, 3] 本身變成了 [4, 5, 6]。

而在此過程當(dāng)中,a 和 b 都沒有動(dòng),他們還貼在那個(gè)物品上。因此自然 a b 的值都變成了 [4, 5, 6]。

搞明白這個(gè)之后就要問了,對(duì)于一個(gè)復(fù)雜對(duì)象的淺copy,在copy的時(shí)候到底發(fā)生了什么?

再看一段代碼:

>>> import copy
>>> origin = [1,2,[3,4]]
#origin里邊有三個(gè)元素:1,2,[3,4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>> cop1 is cop2
False
#cop1和cop2看上去相同,但已不再是同一個(gè)object
>>> origin[2][0] = "hey!"
>>>origin
[1,2,["hey!", 4]]
>>>cop1
[1,2,['hey!',4]]
>>>cop2
[1,2,[3,4]]
#把origin內(nèi)的子list [3,4]改掉了一個(gè)元素,觀察cop1和cop2

學(xué)過docker的人應(yīng)該對(duì)鏡像這個(gè)概念不陌生,我們可以把鏡像的概念套用在copy上面。

概念圖如下:

copy對(duì)于一個(gè)復(fù)雜對(duì)象的子對(duì)象并不會(huì)完全復(fù)制,什么是復(fù)雜對(duì)象的子對(duì)象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是復(fù)雜對(duì)象的子對(duì)象。對(duì)于子對(duì)象,python會(huì)把它當(dāng)作一個(gè)公共鏡像存儲(chǔ)起來(lái),所有對(duì)他的復(fù)制都被當(dāng)成一個(gè)引用,所以說當(dāng)其中一個(gè)引用將鏡像改變了之后另一個(gè)引用使用鏡像的時(shí)候鏡像已經(jīng)被改變了。

所以說看這里的origin[2],也就是[3, 4]這個(gè) list。根據(jù) shallow copy 的定義,在 cop1[2] 指向的是同一個(gè) list [3, 4]。那么,如果這里我們改變了這個(gè) list,就會(huì)導(dǎo)致 origin 和 cop1 同時(shí)改變。這就是為什么上邊 origin[2][0] = “hey!” 之后,cop1 也隨之變成了 [1, 2, [‘hey!’, 4]]。

而deepcopy概念圖如下:

deepcopy的時(shí)候會(huì)將復(fù)雜對(duì)象的每一層復(fù)制一個(gè)單獨(dú)的個(gè)體出來(lái)。

這時(shí)候的 origin[2] 和 cop2[2] 雖然值都等于 [3, 4],但已經(jīng)不是同一個(gè) list了。即我們尋常意義上的復(fù)制。

到此這篇關(guān)于Python copy()與deepcopy()方法之間有什么區(qū)別的文章就介紹到這了,更多相關(guān)Python copy()與deepcopy()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼

    大家好,本篇文章主要講的是Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python設(shè)計(jì)模式之MVC模式簡(jiǎn)單示例

    Python設(shè)計(jì)模式之MVC模式簡(jiǎn)單示例

    這篇文章主要介紹了Python設(shè)計(jì)模式之MVC模式,簡(jiǎn)單介紹了MVC模式的概念、原理,并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)與使用MVC模式的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • python實(shí)現(xiàn)模擬數(shù)字的魔術(shù)游戲

    python實(shí)現(xiàn)模擬數(shù)字的魔術(shù)游戲

    這篇文章介紹了python實(shí)現(xiàn)模擬數(shù)字的魔術(shù)游戲,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2021-12-12
  • Python frozenset集合的實(shí)現(xiàn)

    Python frozenset集合的實(shí)現(xiàn)

    frozenset是Python中的不可變集合類型,本文主要介紹了Python frozenset集合的實(shí)現(xiàn), 文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法

    python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法

    這篇文章主要介紹了python通過BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法,實(shí)例分析了BF算法的原理與Python實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python簡(jiǎn)單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    python簡(jiǎn)單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    你會(huì)用python獲取各種DOS命令顯示的內(nèi)容核心嗎?說的可不是返回值,是用system()函數(shù)調(diào)用windows操作系統(tǒng)的DOS命令來(lái)做點(diǎn)事情,需要的朋友可以參考下
    2021-10-10
  • Python 比較兩個(gè) CSV 文件的三種方法并打印出差異

    Python 比較兩個(gè) CSV 文件的三種方法并打印出差異

    這篇文章主要介紹了Python 比較兩個(gè) CSV 文件并打印出差異,本文將討論比較兩個(gè) CSV 文件的各種方法,我們將包括執(zhí)行此操作的最“Pythonic”方式和可幫助簡(jiǎn)化此任務(wù)的外部 Python 模塊,需要的朋友可以參考下
    2023-06-06
  • Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法

    Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法,涉及Python數(shù)學(xué)運(yùn)算結(jié)合時(shí)間函數(shù)顯示進(jìn)度效果的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Python 實(shí)現(xiàn)淘寶秒殺的示例代碼

    Python 實(shí)現(xiàn)淘寶秒殺的示例代碼

    本篇文章主要介紹了Python 實(shí)現(xiàn)淘寶秒殺的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-01-01
  • python爬蟲之爬取百度翻譯

    python爬蟲之爬取百度翻譯

    這篇文章主要介紹了python爬蟲之爬取百度翻譯,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們喲喲非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

安陆市| 酒泉市| 云霄县| 冷水江市| 彭山县| 怀柔区| 阜平县| 伊通| 甘洛县| 济源市| 万年县| 彭泽县| 西宁市| 霍邱县| 呼和浩特市| 泸西县| 吉首市| 吉木萨尔县| 会宁县| 屯昌县| 滦南县| 襄樊市| 无锡市| 宜兰县| 都江堰市| 灵璧县| 昭平县| 广河县| 南平市| 蒲江县| 大埔区| 济南市| 海阳市| 吴忠市| 临安市| 陇川县| 云龙县| 巧家县| 隆林| 特克斯县| 隆化县|