有人能夠向我解釋一下嗎? 這對我來講毫無心義。 python
我將字典複製到另外一個字典中,而後編輯第二個字典,而且二者都已更改。 爲何會這樣呢? 程序員
>>> dict1 = {"key1": "value1", "key2": "value2"} >>> dict2 = dict1 >>> dict2 {'key2': 'value2', 'key1': 'value1'} >>> dict2["key2"] = "WHY?!" >>> dict1 {'key2': 'WHY?!', 'key1': 'value1'}
您也可使用字典理解功能來製做新字典。 這樣能夠避免導入副本。 spa
dout = dict((k,v) for k,v in mydict.items())
固然,在python> = 2.7中,您能夠執行如下操做: code
dout = {k:v for k,v in mydict.items()}
可是對於向後兼容,頂級方法更好。 對象
雖然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
模塊docs : get
淺表複製和深度複製之間的區別僅與複合對象(包含其餘對象的對象,如列表或類實例)有關: it
- 淺表副本構造一個新的複合對象,而後(在可能的範圍內)將對原始對象中找到的對象的引用插入其中。
- 深層副本將構造一個新的複合對象,而後遞歸地將原始對象中發現的對象的副本插入其中。
Python 毫不會隱式複製對象。 設置dict2 = dict1
, dict2 = dict1
它們引用相同的確切dict對象,所以,在對它進行突變時,對其的全部引用將始終引用該對象的當前狀態。 io
若是要複製字典(這種狀況不多見),則必須使用 import
dict2 = dict(dict1)
要麼
dict2 = dict1.copy()
dict2 = dict1
不復制字典。 它只是爲程序員提供了第二種方式( dict2
)來引用同一詞典。
當你將dict2 = dict1
,你是否是作的副本dict1
,它致使dict2
是爲另外一個名稱而已dict1
。
要複製諸如字典之類的可變類型,請使用copy
模塊的copy
/ deepcopy
。
import copy dict2 = copy.deepcopy(dict1)