2015-09-22 97 views
-1

我有一個包含元組的列表字典。我想創建一個字典的副本並只編輯其中一個副本。下面是複製的字典的四種方法,通常爲我工作:如果您嘗試更改格言在Python中複製字典

import copy 

dicta = {'A':[(1,1)]} 
dictb = dicta.copy() 
dictc = dict(dicta) 
dictd = dict((k,v) for k,v in dicta.items()) 
dicte = copy.deepcopy(dicta) 

dicta['A'][0] = [(9,9)] 

你會發現,每個副本仍然指向相同的字典格言,除了對於通過copy.deepcopy創建的副本。儘管dicta is dictX爲所有副本返回False,但發生這種情況。

這是怎麼回事?

+0

'dicta [「A」]是dictX [「A」]'return? – Kevin

+0

請注意,如果您不希望'dicta ['A']'的新內容成爲_nested_列表,那麼可以使用其他複製技術,如果您執行'dicta ['A'] = [(9,9 )]'。當然,如果你做'口述'['A'] [0] =(9,9)',他們將不會工作。 –

回答

3

dictbdictddicta的「淺拷貝」。這意味着它們確實是新詞典(這就是爲什麼它們與dicta不同),但它們的內容是相同的對象。看看這裏:

>>> dicta is dictb 
False 
>>> dicta['A'] is dictb['A'] 
True 
>>> dicta['A'] is dicte['A'] 
False 

只有deepcopy的命令進去,使的東西它複製,遞歸的內容拷貝。

1

只有copy.deepcopy()以遞歸方式複製詞典,這就是爲什麼只有它有效。其他方法不會遞歸遍歷所有字典並保持指向所有相同列表(或字典中存儲的任何對象)的鏈接,但它們仍然返回不同的字典(這就是爲什麼dicta is dictX對所有副本返回False) 。例如。您可以嘗試刪除副本中的一些條目,並且相應條目不會在原始條目中被刪除。

你可以閱讀更多關於它在這裏:它https://docs.python.org/3.5/library/copy.html

1

您剛纔複製的字典,而不是東西。所以你做了一個新的字典,但它指向相同的列表。

0

,如果你會嘗試dicta == dictX它會回報true所有除了通過copy.deepcopy

其創建的副本,因爲is檢查,如果兩個變量指向同一object.Here當你創建一個副本,它們指向不同的字典字典。

入住這

>>>id(dicta) 
>>>id(dictb) 
>>>id(dicta['A']) 
>>>id(dictb['A']) 

這將清除您的疑問。

+1

'a是a.copy()'將返回'False'。在IDLE中嘗試一下。 –

+0

'a是a.copy()'只對不可變類型返回'True'。對於不可變類型,'a'和'a.copy()'的'id'是相同的。對於列表,它將返回「False」。 – Anshuman