2017-07-17 88 views
0

我正在做一些Python基本操作(3.6,但也在Python 2.11中測試 - 行爲是相同的)和字典。下面是代碼示例:Python管理多個詞典

max_values = dict() 
min_values = dict() 

initial_values = {"stat": 2, "value": 5.5} 

max_values["zzz"] = initial_values 
min_values["zzz"] = initial_values 

到目前爲止好,當我打印這些字典:

for key, value in max_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("max_values", key, value)) 

for key, value in min_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("min_values", key, value)) 

我得到我預期的結果:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 

但是,如果我嘗試修改與值,例如:

min_values["zzz"]["value"] = 1.0 

並再次做同樣的打印,我得到:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 

的問題是:爲什麼在max_values字典改變?我只修改min_values,但這個新的關鍵任務min_value字典也修改max_values。難道我做錯了什麼?

+4

確認** _不復制_ **。這兩個詞典鍵都有對同一個詞典的引用。您需要明確告訴Python爲兩個鍵創建'initial_values'副本。 –

+1

'max_values [「zzz」] = dict(initial_values)' –

+1

@ Jean-FrançoisFabre或'max_values [「zzz」] = initial_values.copy()'。 –

回答

0

你只有一個字典initial_values和你的字典都指的是相同的字典initial_values。你必須複製這個詞典來得到另一個字典。

嘗試:

max_values["zzz"] = initial_values 
min_values["zzz"] = dict(initial_values) 

或:

max_values["zzz"] = initial_values 
min_values["zzz"] = initial_values.copy() 

現在這個結構:

min_values["zzz"]["value"] = 1.0 

for key, value in max_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("max_values", key, value)) 

for key, value in min_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("min_values", key, value)) 

獲得預期的結果:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 
1

這是因爲max_values和min_values鏈接在一起。也就是說,它們都是引用initial_values。所以如果你改變一個你改變另一個。一種解決方案是使用deepcopy。

-2

因爲你給了兩個值相同的字典只看你的代碼的前兩行。

0

enter image description here

正如可以從該圖中,Max_valueMin_value參照Initial_value,這意味着Max_valueMin_value鏈接到創建initial_value字典的地址看到。一旦更新了initial_val內的值,它也會同時顯示在Max_valueMin_value之間。

爲了避免這個問題,你可以使用from copy import deepcopy.

my_dict = {'1': 1, '1': 2} 
new_dict= deepcopy(my_dict) 

通過這種方式,它創造了舊字典一個新的實例。

+0

就是這樣!感謝您的視覺表達。 – buuren