[Python]copy模組學習 — 深拷貝和淺拷貝

來源:互聯網
上載者:User
文章目錄
  • 第一種就是使用copy.copy()方法
  • 第二種是切片淺拷貝
  • 第三種就是list,dict,set,tuple的建構函式來做copy
  • 家庭一 :淺拷貝
  • 家庭二:深拷貝

Python拷貝對象常用的模組是copy模組,這個模組有兩個方法,copy,deepcopy也就是常說的淺拷貝和深拷貝
那麼2種拷貝有什麼不同呢? 今天就來研究下,這裡研究對象是否相同用的是id()方法,也可以用is方法來判斷

淺拷貝有幾種方法:第一種就是使用copy.copy()方法

>>> import copy>>> a = [[1,3]]>>> b = copy.copy(a)>>> print id(a),id(b) #a b引用的id不同48701112 48720992>>> id(a[0]) #但是a,b內元素的id是相同的 48697992>>> id(b[0])48697992

第二種是切片淺拷貝

>>> print id(a[0]),id(c[0])48697992 48697992
第三種就是list,dict,set,tuple的建構函式來做copy
>>> print id(a[0]),id(d[0])48697992 48697992>>> a[0] == b[0]True>>> a[0] is d[0]True

深拷貝只有用copy的deepcopy方法了

>>> e = copy.deepcopy(a)>>> a[0] == e[0]True>>> a[0] is e[0]False>>> print id(a[0]),id(e[0]) #這次我們發現深拷貝後的e的第一個元素id和原來的a的子項目的id不同了48697992 48692160

引用python核心編程的一段話來總結下 
第一,非容器類型(比如數字,字串和其他"原子"類型的對象,像代碼,類型和 xrange 對象等)沒有被拷貝一說,淺拷貝是用完全切片操作來完成的.
第二,如果元組變數只包含原子類型對象,對它的深拷貝將不會進行.

那這種不同的拷貝會給我們帶來怎麼樣的奇怪的問題呢?來看看python核心編程中一個很好的例子
加入說我們用 person = ['name',['saving',100.00]]來表示一個人和他的存款,假設現在有2對夫,我們來看看不同拷貝造成的影響

案例家庭一 :淺拷貝
>>> person = ['name',['saving',100.00]]>>> husband1 = person>>> wife1 = person>>> print husband1,wife1['name', ['saving', 100.0]] ['name', ['saving', 100.0]] #現在我們看到2個人的賬戶中都是100塊>>> husband1[1][1] = 50.00 #現在丈夫取走50 >>> print husband1,wife1['name', ['saving', 50.0]] ['name', ['saving', 50.0]] # 怎麼妻子也是50了呢

也就是說其實夫妻是共同的一個賬戶,一個人的變化也會影響到另一個人的金額的變化

家庭二:深拷貝

>>> person = ['name',['saving',100.00]]>>> husband2 = person>>> wife2 = copy.deepcopy(person)>>> husband2[0] = 'Jack'>>> wife2[0] = 'Rose'>>> print husband2,wife2['Jack', ['saving', 100.0]] ['Rose', ['saving', 100.0]] #2個人都是100塊>>> husband2[1][1] = 50.00  #丈夫取出50 >>> print husband2,wife2['Jack', ['saving', 50.0]] ['Rose', ['saving', 100.0]] #妻子還是100

深拷貝之後丈夫和妻子的賬戶都是獨立的,誰也不會影響誰

看到差別了嗎,如果我們想讓一個容器類型的一個容器類型的子項目不被所有引用對象共用,就要使用深拷貝了。

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.