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

Python-copy()與deepcopy()區(qū)別詳解

 更新時(shí)間:2019年07月12日 10:46:55   作者:枕畔雪  
這篇文章主要介紹了Python-copy()與deepcopy()區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

最近在實(shí)習(xí),boss給布置了一個(gè)python的小任務(wù),學(xué)習(xí)過程中發(fā)現(xiàn)copy()和deepcopy()這對好基友實(shí)在是有點(diǎn)過分,搞的博主就有點(diǎn)傻傻分不清啊,但是呢本著一探到底的精神,還是要查資料搞清楚這對好基友的區(qū)別。

其實(shí)呢,copy()與deepcopy()之間的區(qū)分必須要涉及到python對于數(shù)據(jù)的存儲方式。

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

—–我們尋常意義的復(fù)制就是深復(fù)制,即將被復(fù)制對象完全再復(fù)制一遍作為獨(dú)立的新個(gè)體單獨(dú)存在。所以改變原有被復(fù)制對象不會對已經(jīng)復(fù)制出來的新對象產(chǎn)生影響。

—–而淺復(fù)制并不會產(chǎn)生一個(gè)獨(dú)立的對象單獨(dú)存在,他只是將原有的數(shù)據(jù)塊打上一個(gè)新標(biāo)簽,所以當(dāng)其中一個(gè)標(biāo)簽被改變的時(shí)候,數(shù)據(jù)塊就會發(fā)生變化,另一個(gè)標(biāo)簽也會隨之改變。這就和我們尋常意義上的復(fù)制有所不同了。

對于簡單的 object,用 shallow copy 和 deep copy 沒區(qū)別

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

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

>>> 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 更加符合我們對「復(fù)制」的直覺定義: 一旦復(fù)制出來了,就應(yīng)該是獨(dú)立的了。如果我們想要的是一個(gè)字面意義的「copy」,那就直接用 deep_copy 即可。

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

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

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

當(dāng)在 Python 中 a = something 應(yīng)該理解為給 something 貼上了一個(gè)標(biāo)簽 a。當(dāng)再賦值給 a 的時(shí)候,就好象把 a 這個(gè)標(biāo)簽從原來的 something 上拿下來,貼到其他對象上,建立新的 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 //改變原來 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è)元素分別改變。

而對 b 的影響則是不同的,一個(gè)沒有讓 b 的值發(fā)生改變,另一個(gè)變了。怎么用上邊的道理來解釋這個(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] 上撕下來,貼到了 [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è)之后就要問了,對于一個(gè)復(fù)雜對象的淺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)該對鏡像這個(gè)概念不陌生,我們可以把鏡像的概念套用在copy上面。 

copy對于一個(gè)復(fù)雜對象的子對象并不會完全復(fù)制,什么是復(fù)雜對象的子對象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是復(fù)雜對象的子對象。對于子對象,python會把它當(dāng)作一個(gè)公共鏡像存儲起來,所有對他的復(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,就會導(dǎo)致 origin 和 cop1 同時(shí)改變。這就是為什么上邊 origin[2][0] = “hey!” 之后,cop1 也隨之變成了 [1, 2, [‘hey!', 4]]。

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)將長圖制作成一個(gè)視頻

    Python實(shí)現(xiàn)將長圖制作成一個(gè)視頻

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)將一個(gè)長圖制作成一個(gè)視頻,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Python中的可視化設(shè)計(jì)與UI界面實(shí)現(xiàn)

    Python中的可視化設(shè)計(jì)與UI界面實(shí)現(xiàn)

    本文介紹了如何使用Python創(chuàng)建用戶界面(UI),包括使用Tkinter、PyQt、Kivy等庫進(jìn)行基本窗口、動(dòng)態(tài)圖表和動(dòng)畫效果的實(shí)現(xiàn),通過示例代碼,展示了如何利用這些庫來構(gòu)建功能強(qiáng)大且美觀的界面
    2025-01-01
  • 關(guān)于Python正則表達(dá)式模塊之re模塊

    關(guān)于Python正則表達(dá)式模塊之re模塊

    這篇文章主要介紹了關(guān)于Python正則表達(dá)式模塊之re模塊,?re模塊是Python中的重要組成部分,這里涉及到字符串的匹配,轉(zhuǎn)換,自定義格式化等,需要的朋友可以參考下
    2023-04-04
  • python 合并多個(gè)excel中同名的sheet

    python 合并多個(gè)excel中同名的sheet

    這篇文章主要介紹了python 如何合并多個(gè)excel中同名的sheet,幫助大家更好的利用python處理excel表格,感興趣的朋友可以了解下
    2021-01-01
  • python安裝包site-packages的方法步驟

    python安裝包site-packages的方法步驟

    本文主要介紹了python安裝包site-packages的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Python實(shí)現(xiàn)讀取txt文件中的數(shù)據(jù)并繪制出圖形操作示例

    Python實(shí)現(xiàn)讀取txt文件中的數(shù)據(jù)并繪制出圖形操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)讀取txt文件中的數(shù)據(jù)并繪制出圖形操作,涉及Python文件讀取、數(shù)值運(yùn)算及基于pylab庫的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • Django model重寫save方法及update踩坑詳解

    Django model重寫save方法及update踩坑詳解

    這篇文章主要介紹了Django model重寫save方法及update踩坑詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python使用Keras OCR實(shí)現(xiàn)從圖像中刪除文本

    Python使用Keras OCR實(shí)現(xiàn)從圖像中刪除文本

    這篇文章主要為大家介紹了如何在Python中利用Keras OCR實(shí)現(xiàn)快速地從圖像中刪除文本,從而作為圖像分類器的預(yù)處理步驟,需要的可以參考一下
    2022-03-03
  • Python讀取實(shí)時(shí)數(shù)據(jù)流示例

    Python讀取實(shí)時(shí)數(shù)據(jù)流示例

    今天小編就為大家分享一篇Python讀取實(shí)時(shí)數(shù)據(jù)流示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中的默認(rèn)參數(shù)詳解

    Python中的默認(rèn)參數(shù)詳解

    這篇文章主要介紹了Python中的默認(rèn)參數(shù)詳解,本文講解了默認(rèn)參數(shù)的基本原理、如何正確地使用可變參數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-06-06

最新評論

九龙城区| 宾川县| 海盐县| 大埔区| 海门市| 股票| 乌海市| 志丹县| 福贡县| 行唐县| 鹤山市| 砚山县| 洛隆县| 金塔县| 商河县| 横峰县| 清流县| 全南县| 凤城市| 呼伦贝尔市| 淅川县| 营山县| 福泉市| 贵溪市| 黑山县| 博客| 上思县| 克拉玛依市| 澜沧| 昭苏县| 衡阳市| 翁牛特旗| 改则县| 日照市| 康平县| 湾仔区| 山阳县| 新沂市| 曲麻莱县| 昌都县| 大新县|