2017-02-28 146 views
0

我有以下變量:Python字典值更新

list_m = ["a","b","c"] 
list_s = ['x','y','z'] 
dict_m = dict.fromkeys(list_m[:]) 
dict_s = dict.fromkeys(list_s[:],copy.deepcopy(dict_m)) # empty dict of dicts 

所以我

In[22]: dict_s 
Out[22]: 
{'x': {'a': None, 'b': None, 'c': None}, 
'y': {'a': None, 'b': None, 'c': None}, 
'z': {'a': None, 'b': None, 'c': None}} 

在更新dict_s值這樣

dict_s['x']['a']= np.arange(10) 

我得到

In[27]: dict_s 
Out[27]: 
{'x': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'y': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'z': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}} 

什麼,而不是我想要的/預期:

In[27]: dict_s 
Out[27]: 
{'x': {'a': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': None, 'c': None}, 
'y': {'a': None, 'b': None, 'c': None}, 
'z': {'a': None, 'b': None, 'c': None}} 

我完全不明白,如果這是一個深/淺拷貝的問題還是其他什麼東西。

+0

請解釋爲什麼你想使用此代碼做。 – Soviut

+0

我想要以後的結果而不是前者 – dayum

+1

您的deepcopy只執行一次,然後將此副本分配給所有三個鍵。嘗試一個字典理解,而不是fromkeys –

回答

3

fromkeys對每個鍵使用相同的默認值。如果你想單獨的值,可以使用字典理解和產生新的字典每個值與fromkeys

>>> list_m = ["a","b","c"] 
>>> list_s = ['x','y','z'] 
>>> dict_s = {x: dict.fromkeys(list_m) for x in list_s} 
>>> dict_s 
{'y': {'a': None, 'c': None, 'b': None}, 'x': {'a': None, 'c': None, 'b': None}, 'z': {'a': None, 'c': None, 'b': None}} 
>>> dict_s['y']['a'] = 100 
>>> dict_s 
{'y': {'a': 100, 'c': None, 'b': None}, 'x': {'a': None, 'c': None, 'b': None}, 'z': {'a': None, 'c': None, 'b': None}}