我想更好地理解Python中的淺和深副本,特別是在涉及字典和列表時。列表和詞典的淺和深副本
比方說,我有一個字典列表,我想具體的鍵('a'
)的值複製到字典中的不同列表下不同的鍵名('x'
):
list_dict = [{'a': 1}, {'a': 2}]
dict1 = {}
dict1['x'] = {}
list1 = []
for entry in list_dict:
dict1['x'] = entry['a']
list1.append(dict1)
>>>print list1
[{'x': 2}, {'x': 2}]
顯然,並非什麼我想了。但是,我知道,我可以一個人字典創建一個淺表副本指定.copy()
:
for entry in list_dict:
dict1['x'] = entry['a']
list1.append(dict1.copy())
>>>print list1
[{'x': 1}, {'x': 2}]
即使是膚淺,它的工作原理。現在,讓我們有點不同 - 我想不把它複製到dict1['x']
,但dict1['x']['y']
:
for entry in list_dict:
dict1['x']['y'] = entry['a']
list1.append(dict1.copy())
>>>print list1
[{'x': {'y': 2}}, {'x': {'y': 2}}]
回到原點 - 這是行不通的!所以,這是第一個問題 - 爲什麼它停止工作?
而第二個問題是,爲什麼添加最後一行使它工作?
for entry in list_dict:
dict1['x']['y'] = entry['a']
list1.append(dict1.copy())
dict1['x'] = {}
>>>print list1
[{'x': {'y': 1}}, {'x': {'y': 2}}]
非常感謝您提前!
P.S.我知道我可以做import copy
然後copy.deepcopy()
,但是我有興趣瞭解爲什麼當我添加更多級別的字典時爲什麼淺拷貝停止工作以及爲什麼「重置」字典的解決方法工作。
爲什麼你認爲一個被稱爲淺而另一個深? –
答案在文檔中https://docs.python.org/2/library/copy.html –