如何複製字典並僅編輯副本

有人能夠向我解釋一下嗎? 這對我來講毫無心義。 python

我將字典複製到另外一個字典中,而後編輯第二個字典,而且二者都已更改。 爲何會這樣呢? 程序員

>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2
{'key2': 'value2', 'key1': 'value1'}
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}

#1樓

您也可使用字典理解功能來製做新字典。 這樣能夠避免導入副本。 spa

dout = dict((k,v) for k,v in mydict.items())

固然,在python> = 2.7中,您能夠執行如下操做: code

dout = {k:v for k,v in mydict.items()}

可是對於向後兼容,頂級方法更好。 對象


#2樓

雖然dict.copy()dict(dict1)生成一個副本,但它們只是淺表副本。 若是要拷貝,則須要copy.deepcopy(dict1) 。 一個例子: 遞歸

>>> source = {'a': 1, 'b': {'m': 4, 'n': 5, 'o': 6}, 'c': 3}
>>> copy1 = x.copy()
>>> copy2 = dict(x)
>>> import copy
>>> copy3 = copy.deepcopy(x)
>>> source['a'] = 10  # a change to first-level properties won't affect copies
>>> source
{'a': 10, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
>>> copy1
{'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
>>> copy2
{'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
>>> copy3
{'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}
>>> source['b']['m'] = 40  # a change to deep properties WILL affect shallow copies 'b.m' property
>>> source
{'a': 10, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
>>> copy1
{'a': 1, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
>>> copy2
{'a': 1, 'c': 3, 'b': {'m': 40, 'o': 6, 'n': 5}}
>>> copy3  # Deep copy's 'b.m' property is unaffected
{'a': 1, 'c': 3, 'b': {'m': 4, 'o': 6, 'n': 5}}

關於淺拷貝和深拷貝,來自Python copy模塊docsget

淺表複製和深度複製之間的區別僅與複合對象(包含其餘對象的對象,如列表或類實例)有關: it

  • 淺表副本構造一個新的複合對象,而後(在可能的範圍內)將對原始對象中找到的對象的引用插入其中。
  • 深層副本將構造一個新的複合對象,而後遞歸地將原始對象中發現的對象的副本插入其中。

#3樓

Python 毫不會隱式複製對象。 設置dict2 = dict1dict2 = dict1它們引用相同的確切dict對象,所以,在對它進行突變時,對其的全部引用將始終引用該對象的當前狀態。 io

若是要複製字典(這種狀況不多見),則必須使用 import

dict2 = dict(dict1)

要麼

dict2 = dict1.copy()

#4樓

dict2 = dict1不復制字典。 它只是爲程序員提供了第二種方式( dict2 )來引用同一詞典。


#5樓

當你將dict2 = dict1 ,你是否是作的副本dict1 ,它致使dict2是爲另外一個名稱而已dict1

要複製諸如字典之類的可變類型,請使用copy模塊的copy / deepcopy

import copy

dict2 = copy.deepcopy(dict1)
相關文章
相關標籤/搜索