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

python中copy()與deepcopy()的區(qū)別小結(jié)

 更新時(shí)間:2018年08月03日 10:54:06   作者:J_pyc  
接觸python有一段時(shí)間了,一直沒有系統(tǒng)的學(xué)習(xí)過,也對(duì)copy,deepcoy傻傻的分不清,故抽出時(shí)間來理一下。 下面這篇文章主要給大家介紹了關(guān)于python中copy()與deepcopy()的區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

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

深復(fù)制被復(fù)制對(duì)象完全再?gòu)?fù)制一遍作為獨(dú)立的新個(gè)體單獨(dú)存在。所以改變?cè)斜粡?fù)制對(duì)象不會(huì)對(duì)已經(jīng)復(fù)制出來的新對(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ì)隨之改變。

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]]

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

Python存儲(chǔ)方式

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

當(dāng)在 Python 中 a = something 應(yīng)該理解為給 something 貼上了一個(gè)標(biāo)簽 a。當(dāng)再賦值給 a 的時(shí)候,就好象把 a 這個(gè)標(biāo)簽從原來的 something 上拿下來,貼到其他對(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è)瓉?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è)變了。怎么用上邊的道理來解釋這個(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è)之后就要問了,對(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ǔ)起來,所有對(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è)體出來。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 詳解如何利用Python進(jìn)行客戶分群分析

    詳解如何利用Python進(jìn)行客戶分群分析

    每個(gè)電子商務(wù)數(shù)據(jù)分析師必須掌握的一項(xiàng)數(shù)據(jù)聚類技能,如果你是一名在電子商務(wù)公司工作的數(shù)據(jù)分析師,從客戶數(shù)據(jù)中挖掘潛在價(jià)值,來提高客戶留存率很可能就是你的工作任務(wù)之一。這篇就來告訴你如何將客戶分成不同的群組,并在一段時(shí)間內(nèi)觀察每個(gè)群組的留存率
    2023-02-02
  • 打開Jupyter Notebook不自動(dòng)跳轉(zhuǎn)到瀏覽器問題以及解決方案

    打開Jupyter Notebook不自動(dòng)跳轉(zhuǎn)到瀏覽器問題以及解決方案

    這篇文章主要介紹了打開Jupyter Notebook不自動(dòng)跳轉(zhuǎn)到瀏覽器問題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 使用Numpy打亂數(shù)組或打亂矩陣行

    使用Numpy打亂數(shù)組或打亂矩陣行

    這篇文章主要介紹了使用Numpy打亂數(shù)組或打亂矩陣行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python基本語法經(jīng)典教程

    Python基本語法經(jīng)典教程

    這篇文章主要介紹了Python基本語法,較為詳細(xì)的分析了Python基本語法所涉及的流程控制語句,表達(dá)式,函數(shù),對(duì)象,類型,數(shù)學(xué)運(yùn)算等概念與使用技巧,需要的朋友可以參考下
    2016-03-03
  • Python文件與文件夾常見基本操作總結(jié)

    Python文件與文件夾常見基本操作總結(jié)

    這篇文章主要介紹了Python文件與文件夾常見基本操作,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)文件與文件夾操作所涉及的常見函數(shù)與方法的使用技巧,需要的朋友可以參考下
    2016-09-09
  • 如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件

    如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件

    這篇文章主要介紹了如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • python二維圖制作的實(shí)例代碼

    python二維圖制作的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于python二維圖制作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • pycharm如何關(guān)閉pytest

    pycharm如何關(guān)閉pytest

    這篇文章主要介紹了pycharm如何關(guān)閉pytest問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 講清楚fit_transform()和transform()的區(qū)別及說明

    講清楚fit_transform()和transform()的區(qū)別及說明

    這篇文章主要介紹了講清楚fit_transform()和transform()的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python學(xué)習(xí)筆記基本數(shù)據(jù)結(jié)構(gòu)之序列類型list tuple range用法分析

    Python學(xué)習(xí)筆記基本數(shù)據(jù)結(jié)構(gòu)之序列類型list tuple range用法分析

    這篇文章主要介紹了Python學(xué)習(xí)筆記基本數(shù)據(jù)結(jié)構(gòu)之序列類型list tuple range用法,結(jié)合具體實(shí)例形式分析了Python序列類型list tuple range基本概念、定義與使用技巧,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

分宜县| 金秀| 搜索| 奇台县| 上栗县| 古交市| 曲阜市| 若尔盖县| 本溪| 浠水县| 堆龙德庆县| 金堂县| 孟津县| 青冈县| 攀枝花市| 雷波县| 宁明县| 怀宁县| 丁青县| 饶河县| 马山县| 磴口县| 浪卡子县| 玛多县| 广灵县| 永平县| 清水县| 玛纳斯县| 新昌县| 开封市| 河西区| 伊宁市| 桂东县| 福州市| 东光县| 常熟市| 兖州市| 凤庆县| 泗水县| 巧家县| 怀远县|