2017-08-26 54 views
0

本質上我試圖給嵌套字典賦值。如果我通過拼寫出來構建詞典,那麼稍後分配一個值就可以按預期工作。但是,如果我創建了一個模板字典,請將其分配給所有鍵,然後再返回並嘗試爲嵌套鍵分配一個值,現在該鍵的每個實例都會獲取該值。更方便地顯示與代碼:爲嵌套字典分配值被不恰當地應用於所有鍵

initialize_dict = {'a':0,'b':0} 
x = {} 
x['FOO'] = initialize_dict 
x['BAR'] = initialize_dict 

y = {'FOO':{'a':0,'b':0},'BAR':{'a':0,'b':0}} 

logging.info("x is {}".format(x)) 
logging.info("y is {}".format(y)) 
logging.info(x==y) 

x['FOO']['a']=13231 
y['FOO']['a']=13231 

logging.info("new x is {}".format(x)) 
logging.info("new y is {}".format(y)) 

而且我的日誌:

INFO:root:x is {'FOO': {'a': 0, 'b': 0}, 'BAR': {'a': 0, 'b': 0}} 
INFO:root:y is {'FOO': {'a': 0, 'b': 0}, 'BAR': {'a': 0, 'b': 0}} 
INFO:root:True 
INFO:root:new x is {'FOO': {'a': 13231, 'b': 0}, 'BAR': {'a': 13231, 'b': 0}} 
INFO:root:new y is {'FOO': {'a': 13231, 'b': 0}, 'BAR': {'a': 0, 'b': 0}} 

正如你所看到的,由於某種原因,價值13231被分配以x爲[「富」] [「一」 ]和['BAR'] ['a']如果我使用模板構建它,但是如果我已經寫出了完整的字典(以y開頭)。我在上面進行測試以確保x和y在嘗試賦值之前是真正等價的。

+0

看initialize_dict的價值,你可能會感到驚訝。 –

回答

1

在Python中,當您分配一個變量時,您將綁定一個名稱給某個對象。在這種情況下,x['FOO']x['BAR']都是綁定到同一個對象的名稱。當您更改x['FOO']['a']時,您正在更改單個對象中的密鑰'a',即x['FOO']x['BAR']指的是。

當您爲x['FOO']['a']指定一個值時,您正在更改x['FOO']['a'],x['BAR']['a']initialize_dict['a']的值。

爲了解決這個問題,你只需要擁有x['FOO']x['BAR']指的initialize_dict副本,使每一個可以獨立改變:

initialize_dict = {'a':0,'b':0} 
x = {} 
x['FOO'] = initialize_dict.copy() # Make copies of the dictionary. 
x['BAR'] = initialize_dict.copy() # 

y = {'FOO':{'a':0,'b':0},'BAR':{'a':0,'b':0}} 

print("x is {}".format(x)) 
print("y is {}".format(y)) 
print(x==y) 

x['FOO']['a']=13231 
y['FOO']['a']=13231 

print("new x is {}".format(x)) 
print("new y is {}".format(y))