亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

在之前的文章中,提到可變對象和不可變對象,接下來也是以這兩者的區(qū)別進行展開

直接賦值

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

>>> 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)于修改新變量的值,對原有變量會產(chǎn)生的影響,在可變對象和不可變對象 中也做了講述,這里通過幾個例子,重新溫習(xí)一下

不可變對象

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

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

可變對象

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

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

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

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

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

淺拷貝和深拷貝

先看一下官方文檔的定義

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ù)合對象,那接下來也只討論復(fù)合對象.

淺拷貝

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

從上圖不難看出,淺拷貝后,新復(fù)合對象包含的對象(可變或者不可變)的 id 值和原有對象包含的對象的 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)在讓我們試著修改一下淺拷貝后的 b 的值,在修改前,可以先思考一下,如果修改 b[0] 可能會發(fā)生什么?

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

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

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

>>> 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] 綁定同一個可變對象,很顯然對 b[2] 的修改同樣會映射到 a[2]

深拷貝

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

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

看一個例子:

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

接下來讓我們修改一下變量 b,這里就不在修改不可變對象 b[0]b[1] 了,因為結(jié)果很明顯,對 a 不會產(chǎn)生任何影響,我們來修改 b[2],那么修改 b[2] 會對 a[2] 產(chǎn)生影響嗎?很明顯答案是不會,因為深拷貝就相當(dāng)于克隆出了一個全新的個體,兩者不再有任何關(guān)系

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

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

相關(guān)文章

  • Python批量刪除或移動指定圖像的實現(xiàn)示例

    Python批量刪除或移動指定圖像的實現(xiàn)示例

    本文主要介紹了Python批量刪除或移動指定圖像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python爬蟲遇到403錯誤的問題及解決

    python爬蟲遇到403錯誤的問題及解決

    這篇文章主要介紹了python爬蟲遇到403錯誤的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python request post上傳文件常見要點

    Python request post上傳文件常見要點

    這篇文章主要介紹了Python request post上傳文件常見要點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • python點云地面點濾波(Progressive Morphological Filter)算法介紹(PCL庫)

    python點云地面點濾波(Progressive Morphological Filter)算法介紹(PCL庫)

    這篇文章主要介紹了python點云地面點濾波(Progressive Morphological Filter)算法介紹(PCL庫),了解膨脹/腐蝕這兩個基礎(chǔ)操作,可以通過對其進行簡單組合來形成開/閉操作,需要的朋友可以參考下
    2021-08-08
  • 教你怎么用Python處理excel實現(xiàn)自動化辦公

    教你怎么用Python處理excel實現(xiàn)自動化辦公

    這篇文章主要介紹了教你怎么用Python處理excel實現(xiàn)自動化辦公,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用tensorflow實現(xiàn)VGG網(wǎng)絡(luò),訓(xùn)練mnist數(shù)據(jù)集方式

    使用tensorflow實現(xiàn)VGG網(wǎng)絡(luò),訓(xùn)練mnist數(shù)據(jù)集方式

    這篇文章主要介紹了使用tensorflow實現(xiàn)VGG網(wǎng)絡(luò),訓(xùn)練mnist數(shù)據(jù)集方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 詳解PyQt5?事件處理機制

    詳解PyQt5?事件處理機制

    PyQt為事件處理提供了兩種機制高級的信號與槽機制,以及低級的事件處理機制,這篇文章主要介紹了PyQt5?事件處理機制,需要的朋友可以參考下
    2022-11-11
  • 詳解Python中類方法@classmethod的應(yīng)用技巧

    詳解Python中類方法@classmethod的應(yīng)用技巧

    在Python中,類方法(class method)是一種特殊的方法,可以在不創(chuàng)建類的實例的情況下調(diào)用,本文將詳細(xì)介紹類方法的概念、用法以及在實際開發(fā)中的應(yīng)用場景,希望對大家有所幫助
    2024-03-03
  • 新版Pycharm中Matplotlib不會彈出獨立的顯示窗口的問題

    新版Pycharm中Matplotlib不會彈出獨立的顯示窗口的問題

    這篇文章主要介紹了解決新版Pycharm中Matplotlib不會彈出獨立的顯示窗口的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python 實現(xiàn)一行輸入多個數(shù)字(用空格隔開)

    Python 實現(xiàn)一行輸入多個數(shù)字(用空格隔開)

    這篇文章主要介紹了Python 實現(xiàn)一行輸入多個數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論