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

詳解Python直接賦值,深拷貝和淺拷貝

 更新時(shí)間:2020年07月09日 10:43:14   作者:Leetao  
這篇文章主要介紹了Python直接賦值,深拷貝和淺拷貝的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

直接賦值: 對(duì)象的引用,也就是給對(duì)象起別名
淺拷貝: 拷貝父對(duì)象,但是不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象。
深拷貝: 拷貝父對(duì)象. 以及其內(nèi)部的子對(duì)象

在之前的文章中,提到可變對(duì)象和不可變對(duì)象,接下來(lái)也是以這兩者的區(qū)別進(jìn)行展開(kāi)

直接賦值

對(duì)于可變對(duì)象和不可變對(duì)象,將一個(gè)變量直接賦值給另外一個(gè)變量,兩者 id 值一致,其實(shí)本質(zhì)上是將變量量綁定到對(duì)象的過(guò)程.

>>> a=1
>>> b=a
>>> id(a) == id(b)
True
>>> c="string"
>>> d=c
>>> id(c) == id(d)
True
>>> e=[1,2,3]
>>> f=e
>>> id(e)==id(f)
True

關(guān)于修改新變量的值,對(duì)原有變量會(huì)產(chǎn)生的影響,在可變對(duì)象和不可變對(duì)象 中也做了講述,這里通過(guò)幾個(gè)例子,重新溫習(xí)一下

不可變對(duì)象

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True
>>>>>> id(x)
1500143776
>>> y=y+1
>>> y
2
>>> x
1
>>> id(x)==id(y)
False
>>> id(y)
1500143808
>>> id(x)
1500143776

對(duì)于不可變對(duì)象,修改賦值后的新變量,不會(huì)對(duì)原有變量造成任何影響.為什么出現(xiàn)這種現(xiàn)象呢?因?yàn)椴豢勺儗?duì)象一旦創(chuàng)建之后就不允許被改變.后面對(duì) y 進(jìn)行的操作,其實(shí)是重新創(chuàng)建一個(gè)對(duì)象并綁定的結(jié)果:

可變對(duì)象

>>> m=[1,2,3]
>>> n=m
>>> id(n)==id(m)
True
>>> id(m)
1772066764488
>>> id(n[0])
1772066764656
>>> n[0]=4
>>> n
[4, 2, 3]
>>> m
[4, 2, 3]
>>> id(n)==id(m)
True
>>> id(m)
1772066764488

對(duì)于可變對(duì)象,修改賦值后的變量,會(huì)對(duì)原有的變量造成影響,會(huì)導(dǎo)致其 value 值的改變,但是其id 值保持不變

從上圖不難看出,這個(gè)時(shí)候的 id(n[0]) 的值,和未修改前的 id值應(yīng)該不一樣,可以輸出看一下

>>>id(n[0])
1772066764752 # 最初沒(méi)有修改前是 1772066764656

n[0] 修改前后為什么 id 值出現(xiàn)改變呢? 首先需要明確一點(diǎn) n[0] 綁定的是一個(gè)不可變對(duì)象,在文章的最初提到,不可變對(duì)象一旦創(chuàng)建就不允許修改.顯然對(duì) n[0] 進(jìn)行修改,不能在綁定對(duì)象的內(nèi)存上進(jìn)行修改,那如何實(shí)現(xiàn)重新賦值呢?只能創(chuàng)建一個(gè)新的對(duì)象 4 ,然后將 n[0] 綁定到新的對(duì)象

淺拷貝和深拷貝

先看一下官方文檔的定義

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or
class instances).
A shallow copy constructs a new compound object and then (to the
extent possible) inserts the same objects into it that the
original contains.
A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.

從文檔中不難看出,上面提到深拷貝和淺拷貝兩者區(qū)別在于在復(fù)合對(duì)象,那接下來(lái)也只討論復(fù)合對(duì)象.

淺拷貝

注意到官方文檔也提到對(duì)淺拷貝和深拷貝的定義,從上文中不難看出,淺拷貝構(gòu)建一個(gè)復(fù)合對(duì)象,然后將原有復(fù)合對(duì)象包含的對(duì)象插入到新的復(fù)合對(duì)象中

從上圖不難看出,淺拷貝后,新復(fù)合對(duì)象包含的對(duì)象(可變或者不可變)的 id 值和原有對(duì)象包含的對(duì)象的 id 值相同

看一下具體例子:

>>> import copy
>>> a=[1,2,[3,4]]
>>> b=copy.copy(a)
>>> id(b[0])==id(a[0])
True
>>> id(b[2])==id(a[2])
True
>>> id(b[2][0])==id(a[2][0])
True

現(xiàn)在讓我們?cè)囍薷囊幌聹\拷貝后的 b 的值,在修改前,可以先思考一下,如果修改 b[0] 可能會(huì)發(fā)生什么?

由于 b[0] = 1,很顯然 1 屬于不可變對(duì)象,那么根據(jù)對(duì)不可變變量修改的規(guī)則,則 b[0] 會(huì)綁定到新的變量上,而 a[0] 的由于沒(méi)有修改,則保持不變,真的是這樣嗎?讓我們驗(yàn)證一下

>>> b[0]=5
>>> b
[5, 2, [3, 4]]
>>> a
[1, 2, [3, 4]]

接下來(lái)我們要嘗試修改一下 b[2],由于 b[2] 綁定的對(duì)象是 list,屬于可變對(duì)象,按照上面說(shuō)的可變對(duì)象修改的規(guī)則,則修改后的 b[2]id 值保持不變,但是其 value 值會(huì)發(fā)生改變. 同樣的讓我們通過(guò)例子驗(yàn)證一下

>>> id(b[2])
4300618568
>>> b[2][0]=6
>>> id(b[2])
4300618568
>>> b
[5, 2, [6, 4]]
>>> a
[1, 2, [6, 4]]

由于 b[2]a[2] 綁定同一個(gè)可變對(duì)象,很顯然對(duì) b[2] 的修改同樣會(huì)映射到 a[2]

深拷貝

深拷貝構(gòu)建一個(gè)復(fù)合對(duì)象,然后遞歸的將原有復(fù)合包含的對(duì)象的副本插入到新的復(fù)合對(duì)象中

若上圖所示,深拷貝后,新的復(fù)合對(duì)象包含的對(duì)象,若對(duì)象為不可變對(duì)象,則 id 值保持不變,若對(duì)象為可變對(duì)象,則 id 值發(fā)生改變

看一個(gè)例子:

>>> import copy
>>> a=[1,2,[3,4]]
>>> b=copy.deepcopy(a)
>>> id(b[0])==id(a[0])
True
>>> id(b[2])==id(a[0])
False
>>> id(b[2][0])==id(a[2][0])
True

接下來(lái)讓我們修改一下變量 b,這里就不在修改不可變對(duì)象 b[0]b[1] 了,因?yàn)榻Y(jié)果很明顯,對(duì) a 不會(huì)產(chǎn)生任何影響,我們來(lái)修改 b[2],那么修改 b[2] 會(huì)對(duì) a[2] 產(chǎn)生影響嗎?很明顯答案是不會(huì),因?yàn)樯羁截惥拖喈?dāng)于克隆出了一個(gè)全新的個(gè)體,兩者不再有任何關(guān)系

>>> b[2][0]=5
>>> b
[1, 2, [5, 4]]
>>> a
[1, 2, [3, 4]]

以上就是詳解Python直接賦值,深拷貝和淺拷貝的詳細(xì)內(nèi)容,更多關(guān)于Python直接賦值,深拷貝和淺拷貝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬蟲(chóng)實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題

    Python爬蟲(chóng)實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題

    這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Django 使用Ajax進(jìn)行前后臺(tái)交互的示例講解

    Django 使用Ajax進(jìn)行前后臺(tái)交互的示例講解

    今天小編就為大家分享一篇Django 使用Ajax進(jìn)行前后臺(tái)交互的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python+opencv實(shí)現(xiàn)車道線檢測(cè)

    python+opencv實(shí)現(xiàn)車道線檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)車道線檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Python datetime模塊的使用示例

    Python datetime模塊的使用示例

    這篇文章主要介紹了Python datetime模塊的使用示例,幫助大家更好的理解和使用python處理時(shí)間,感興趣的朋友可以了解下
    2021-02-02
  • Python 多線程實(shí)例詳解

    Python 多線程實(shí)例詳解

    這篇文章主要介紹了Python 多線程實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 狀態(tài)機(jī)的概念和在Python下使用狀態(tài)機(jī)的教程

    狀態(tài)機(jī)的概念和在Python下使用狀態(tài)機(jī)的教程

    這篇文章主要介紹了狀態(tài)機(jī)的概念和在Python下使用狀態(tài)機(jī)的教程,本文來(lái)自于IBM官方開(kāi)發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • python實(shí)現(xiàn)kNN算法識(shí)別手寫(xiě)體數(shù)字的示例代碼

    python實(shí)現(xiàn)kNN算法識(shí)別手寫(xiě)體數(shù)字的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)kNN算法識(shí)別手寫(xiě)體數(shù)字的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 一文詳細(xì)NumPy中np.zeros的使用

    一文詳細(xì)NumPy中np.zeros的使用

    np.zeros是NumPy庫(kù)中一個(gè)非常實(shí)用的函數(shù),用于快速創(chuàng)建指定形狀和大小的全零數(shù)組,本文主要介紹了NumPy中np.zeros的使用,感興趣的可以了解一下
    2024-03-03
  • Ruby使用eventmachine為HTTP服務(wù)器添加文件下載功能

    Ruby使用eventmachine為HTTP服務(wù)器添加文件下載功能

    這篇文章主要介紹了Ruby使用eventmachine為HTTP服務(wù)器添加文件下載功能的實(shí)例,同時(shí)作者也分享了Windows上eventmachine安裝報(bào)錯(cuò)問(wèn)題的解決方法,需要的朋友可以參考下
    2016-04-04
  • Python的加密模塊之hashlib 與 base64詳解及常用加密方法

    Python的加密模塊之hashlib 與 base64詳解及常用加密方法

    我們來(lái)學(xué)習(xí)一下 Python 中的加密模塊,加密模塊在工作中被廣泛應(yīng)用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過(guò)把數(shù)據(jù)加密。這樣即使被捕獲也無(wú)法獲取到數(shù)據(jù)的真實(shí)信息,今天我們就來(lái)學(xué)習(xí)一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧
    2023-02-02

最新評(píng)論

静宁县| 花莲县| 芜湖县| 扶风县| 长沙县| 醴陵市| 东城区| 隆昌县| 曲阳县| 孟津县| 伽师县| 樟树市| 图木舒克市| 平罗县| 上犹县| 乡城县| 德昌县| 延长县| 宝山区| 睢宁县| 旌德县| 封丘县| 临颍县| 五常市| 闽清县| 绿春县| 阳江市| 桃园市| 黄平县| 崇义县| 桦川县| 昌吉市| 佛山市| 介休市| 平昌县| 钟祥市| 霍林郭勒市| 儋州市| 阿拉善左旗| 大邑县| 阳泉市|