欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中的深拷貝和淺拷貝詳解

 更新時間:2015年06月03日 10:25:17   投稿:junjie  
這篇文章主要介紹了Python中的深拷貝和淺拷貝詳解,本文講解了變量-對象-引用、可變對象-不可變對象、拷貝等內(nèi)容,需要的朋友可以參考下

要說清楚Python中的深淺拷貝,需要搞清楚下面一系列概念:
變量-引用-對象(可變對象,不可變對象)-切片-拷貝(淺拷貝,深拷貝)

【變量-對象-引用】

在Python中一切都是對象,比如說:3, 3.14, 'Hello', [1,2,3,4],{'a':1}......

甚至連type其本身都是對象,type對象
Python中變量與C/C++/Java中不同,它是指對象的引用,Python是動態(tài)類型,程序運行時候,會根據(jù)對象的類型
來確認變量到底是什么類型。

單獨賦值: 比如說:

復制代碼 代碼如下:

>>> a = 3

在運行a=3后,變量a變成了對象3的一個引用。在內(nèi)部,變量事實上是到對象內(nèi)存空間的一個指針

因為Python的變量不過是對象的引用,或指向?qū)ο蟮闹羔?,因此在程序中可以?jīng)常改變變量引用

復制代碼 代碼如下:

>>> x = 42      #變量綁定到整型對象
>>> x = 'Hello' #現(xiàn)在又成了字符串
>>> x = [1,2,3] #現(xiàn)在又成了列表

專業(yè)表述如下:

變量是一個系統(tǒng)表的元素,擁有指向?qū)ο蟮倪B接的空間
對象是被分配的一塊內(nèi)存,存儲其所代表的值
引用是自動形成的從變量到對象的指針
特別注意: 類型屬于對象,不是變量
比如像剛才的a=3, 整數(shù)對象3包含了兩重信息
1.值為3
2.一個頭部信息:告訴Pthyon,這是個整數(shù)對象[相當于一個指向int的指針]

共享引用: 比如說:

復制代碼 代碼如下:

>>> a = 3
>>> b = a

在運行賦值語句b = a之后,變量a和變量b指向了同一個對象的內(nèi)存空間.

從上圖可以看到,a和b,其id完全一樣,指向同一個整數(shù)對象3,或者說同一塊內(nèi)存

如果刪掉a后, 不會影響b

拷貝概念的引入就是針對:可變對象的共享引用潛在的副作用而提出的.
【可變對象-不可變對象】
在Python中不可變對象指:一旦創(chuàng)建就不可修改的對象,包括字符串,元祖,數(shù)字
在Python中可變對象是指:可以修改的對象,包括:列表、字典
上面說的a,b都是整數(shù),整數(shù)是不可變對象,如果是可變對象的話,就是另外一回事了。

復制代碼 代碼如下:

>>> L1 = [2,3,4]      #L1變量指向的是一個可變對象:列表 
>>> L2 = L1           #將L1值賦給L2后,兩者共享引用同一個列表對象[1,2,3,4] 
>>> L1[0] = 200       #因為列表可變,改變L1中第一個元素的值 
>>> L1; L2            #改變后,L1,L2同時改變,因為對象本身值變了 
[200, 3, 4] 
[200, 3, 4] 

如果不想改變列表L2的值,有兩種方法:切片 和 copy模塊
復制代碼 代碼如下:

>>> L1 = [2,3,4]  
>>> L2 = L1 
>>> id(L1);id(L2)     #共享引用一個可變對象 
45811784L 
45811784L 
>>> L2 = L1[:]        #切片操作 
>>> id(L1);id(L2)     #切片后,對象就不一樣了 
45811784L 
45806920L 
>>> L1[0] = 200 
>>> L1;L2             #L1發(fā)生改變,L2沒有變化 
[200, 3, 4] 
[2,   3, 4] 

【拷貝】
1. 切片技術應用于所有的序列,包括:列表、字符串、元祖
   >>>但切片不能應用于字典。對字典只能使用D.copy()方法或D.deepcopy()方法.

2. 深淺拷貝,即可用于序列,也可用于字典

復制代碼 代碼如下:

   >>> import copy
   >>> X = copy.copy(Y)      #淺拷貝:只拷貝頂級的對象,或者說:父級對象
   >>> X = copy.deepcopy(Y)  #深拷貝:拷貝所有對象,頂級對象及其嵌套對象。或者說:父級對象及其子對象

如果字典只有頂級對象:

如果字典中嵌套對象:

【結論】

深淺拷貝都是對源對象的復制,占用不同的內(nèi)存空間
如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
如果源對象不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝
序列對象的切片其實是淺拷貝,即只拷貝頂級的對象

相關文章

  • 網(wǎng)紅編程語言Python將納入高考你怎么看?

    網(wǎng)紅編程語言Python將納入高考你怎么看?

    12月編程語言排行榜出爐,在編程排行榜上,排名第四的是Python。而網(wǎng)絡上也瘋傳,編程語言Python將納入高考,Python不虧是網(wǎng)紅的編程語言
    2018-06-06
  • python實現(xiàn)簡單的超市商品銷售管理系統(tǒng)

    python實現(xiàn)簡單的超市商品銷售管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)超市商品銷售管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • windows python3安裝Jupyter Notebooks教程

    windows python3安裝Jupyter Notebooks教程

    這篇文章主要介紹了windows python3安裝Jupyter Notebooks教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • PyTorch基礎之torch.nn.CrossEntropyLoss交叉熵損失

    PyTorch基礎之torch.nn.CrossEntropyLoss交叉熵損失

    這篇文章主要介紹了PyTorch基礎之torch.nn.CrossEntropyLoss交叉熵損失講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解python中DRF框架的數(shù)據(jù)校驗方式

    詳解python中DRF框架的數(shù)據(jù)校驗方式

    這篇文章主要為大家詳細介紹了python中DRF框架的數(shù)據(jù)校驗方式,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • 深入了解Python的多線程基礎

    深入了解Python的多線程基礎

    這篇文章主要為大家介紹了Python多線程基礎,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python使用type動態(tài)創(chuàng)建類操作示例

    Python使用type動態(tài)創(chuàng)建類操作示例

    這篇文章主要介紹了Python使用type動態(tài)創(chuàng)建類操作,結合實例形式詳細分析了Python使用type動態(tài)創(chuàng)建類的具體原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 如何利用python實現(xiàn)列表嵌套字典取值

    如何利用python實現(xiàn)列表嵌套字典取值

    這篇文章主要介紹了如何利用python實現(xiàn)列表嵌套字典取值,首先通過將列表backup_unit_id全部提取出來,確定需要取值的對象展開文章內(nèi)容,感興趣的朋友可以看一下
    2022-06-06
  • python簡單實現(xiàn)刷新智聯(lián)簡歷

    python簡單實現(xiàn)刷新智聯(lián)簡歷

    本文給大家分享的是個人弄的一個使用Python簡單實現(xiàn)刷新智聯(lián)招聘簡歷的小工具的代碼,非常的簡單,給大家參考下吧。
    2016-03-03
  • python亂序字符串排序的實現(xiàn)方式

    python亂序字符串排序的實現(xiàn)方式

    這篇文章主要介紹了python亂序字符串排序的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論