文章目錄
- 第一種就是使用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
深拷貝之後丈夫和妻子的賬戶都是獨立的,誰也不會影響誰
看到差別了嗎,如果我們想讓一個容器類型的一個容器類型的子項目不被所有引用對象共用,就要使用深拷貝了。