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

來源:互聯網
上載者:User

   這篇文章主要介紹了Python中的深拷貝和淺拷貝詳解,本文講解了變數-對象-引用、可變對象-不可變對象、拷貝等內容,需要的朋友可以參考下

  要說清楚Python中的深淺拷貝,需要搞清楚下面一系列概念:

  變數-引用-對象(可變對象,不可變對象)-切片-拷貝(淺拷貝,深拷貝)

  【變數-對象-引用】

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

  甚至連type其本身都是對象,type對象

  Python中變數與C/C++/Java中不同,它是指對象的引用,Python是動態類型,程式運行時候,會根據對象的類型

  來確認變數到底是什麼類型。

  單獨賦值: 比如說:

  複製代碼 代碼如下:

  >>> a = 3

  在運行a=3後,變數a變成了對象3的一個引用。在內部,變數事實上是到對象記憶體空間的一個指標

  因為Python的變數不過是對象的引用,或指向對象的指標,因此在程式中可以經常改變變數引用

  複製代碼 代碼如下:

  >>> x = 42 #變數綁定到整型對象

  >>> x = 'Hello' #現在又成了字串

  >>> x = [1,2,3] #現在又成了列表

  專業表述如下:

  變數是一個系統資料表的元素,擁有指向對象的串連的空間

  對象是被分配的一塊記憶體,儲存其所代表的值

  引用是自動形成的從變數到對象的指標

  特別注意: 類型屬於對象,不是變數

  比如像剛才的a=3, 整數對象3包含了兩重資訊

  1.值為3

  2.一個頭部資訊:告訴Pthyon,這是個整數對象[相當於一個指向int的指標]

  共用引用: 比如說:

  複製代碼 代碼如下:

  >>> a = 3

  >>> b = a

  在運行指派陳述式b = a之後,變數a和變數b指向了同一個對象的記憶體空間.

  從上圖可以看到,a和b,其id完全一樣,指向同一個整數對象3,或者說同一塊記憶體

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

  拷貝概念的引入就是針對:可變對象的共用引用潛在的副作用而提出的.

  【可變對象-不可變對象】

  在Python中不可變對象指:一旦建立就不可修改的對象,包括字串,元祖,數字

  在Python中可變對象是指:可以修改的對象,包括:列表、字典

  上面說的a,b都是整數,整數是不可變對象,如果是可變對象的話,就是另外一回事了。

  複製代碼 代碼如下:

  >>> 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發生改變,L2沒有變化

  [200, 3, 4]

  [2, 3, 4]

  【拷貝】

  1. 切片技術應用於所有的序列,包括:列表、字串、元祖

  >>>但切片不能應用於字典。對字典只能使用D.copy()方法或D.deepcopy()方法.

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

  複製代碼 代碼如下:

  >>> import copy

  >>> X = copy.copy(Y) #淺拷貝:只拷貝頂級的對象,或者說:父級對象

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

  如果字典只有頂級對象:

  如果字典中嵌套對象:

  【結論】

  深淺拷貝都是對來源物件的複製,佔用不同的記憶體空間

  如果來源物件只有一級目錄的話,源做任何改動,不影響深淺拷貝對象

  如果來源物件不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝

  序列對象的切片其實是淺拷貝,即只拷貝頂級的對象

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。