我正在使用 Python 3,并且正在嘗試將兩個字典字典合并到一個字典中。但是,我成功了,當我將新的鍵/值對添加到新字典時,它也會將它添加到兩個原始字典中。我希望原來的字典保持不變。
dict1 = {'key_val_1': {'a': '1', 'b': '2', 'c': '3'}}
dict2 = {'key_val_2': {'d': '4', 'e': '5', 'f': '6'}}
dict3 = dict1 | dict2
for x in dict3:
dict3[x]['g'] = '7'
上面的代碼會將 'g': '7' 附加到所有 3 個字典,我只想更改 dict3。我必須假設這是預期的行為,但對于我的生活,我無法理解為什么(或如何獲得預期的結果)。
uj5u.com熱心網友回復:
我相信你的問題的根源是你的假設,當連接兩個字典 dict1 和 dict2 時,python 在連接它們之前會復制字典。事實上,Python 只是簡單地創建了一個帶有指向每個部分的指標的新物件。考慮到這一點,當您更改 dict3 的一部分內容時,您實際上是在更改基礎字典 dict1 和 dict2。要糾正這種情況,您需要在連接它們之前復制基礎字典或合并它們而不是連接它們。
使用復制功能:
from copy import deepcopy
dict3 = deepcopy(dict1) | deepcopy(dict2)
現在 dict3 包含 dict1 和 dict2 的獨立副本
要合并字典:
from copy import copy
def merge(d1, d2):
rslt = dict()
for k in d1.keys():
rslt[k] = d1[k].copy() #Note still necessary to copy underlying dict
for k in d2.keys():
rslt[k] = d2[k].copy()
return rslt
然后使用:
dict3 = merge(dict1, dict2)
uj5u.com熱心網友回復:
您遇到的問題是因為包含對和dict3中的子字典的參考。物件是。因此,當您在一個地方更改 a 時,它會影響參考它的所有地方。您可以使用該功能進行驗證。例子:dict1dict2dictmutabledictid()
>>> print(id(dict1['key_val_1']))
>>> 140294429633472
>>> print(id(dict3['key_val_1']))
>>> 140294429633472
>>> print(id(dict2['key_val_2']))
>>> 140294429633728
>>> print(id(dict3['key_val_2']))
>>> 140294429633728
從上面的示例中,您可以驗證 和 中的子dict1字典dict2在dict3. 因此,當您在dict3原始字典中修改它們時,它們也會被修改,dict就像mutable.
因此,要解決您的問題,您需要deep copy在合并它們之前制作每個子字典。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/489300.html
標籤:python-3.x
上一篇:Python嵌套groupby
