我試圖定義一個函數來創建一個兩層的字典,所以它應該產生的格式爲什麼兩級字典的值都指向Python 2.7中的同一個對象?
dict = {tier1:{tier2:value}}.
的代碼是:
def two_tier_dict_init(tier1,tier2,value):
dict_name = {}
for t1 in tier1:
dict_name[t1] = {}
for t2 in tier2:
dict_name[t1][t2] = value
return dict_name
下面這個例子......
tier1 = ["foo","bar"]
tier2 = ["x","y"]
value = []
foobar_dict = two_tier_dict_init(tier1,tier2,value)
在它的面前
產生我想要的東西:
foobar_dict = {'foo':{'x': [],'y':[]},
'bar':{'x': [],'y':[]}} }
然而,附加像
foobar_dict["foo"]["x"].append("thing")
任何值時,所有的數值得到附加這樣的結果是:
foobar_dict = {'foo':{'x': ["thing"],'y':["thing"]},
'bar':{'x': ["thing"],'y':["thing"]}}
起初我以爲,由於方式我定義構建字典,所有值指向內存中的相同空間,但我無法弄清楚爲什麼應該如此。後來我發現,如果我從一個空表的值更改爲整數,因此當我這樣做,
foobar_dict["foo"]["x"] +=1
只有所需的值被改變。
因此,我必須得出結論,這是與list.append
方法有關,但我無法弄清楚。什麼是解釋?
N.B.我需要這個功能來構建大型字典,每個字典都有數百個元素。我也用同樣的方法構建了一個三層版本,並且出現了相同的問題。
我喜歡工廠的方法(+1)。 – NPE
這一切都有道理,謝謝指出,value_factory方法是完美的。優秀的迴應 –