2017-05-25 61 views
0

我有一個函數可以創建一個帶有特定鍵的字典,它接受一個參數來指定每個鍵的「默認」值應該是什麼。使用默認值創建字典的功能,可以是不可變或可變的

def new_dict(entrys_default=0): 
    my_dict = {} 
    for k in ['a', 'b', 'c']: 
     my_dict[k] = entrys_default 
    return my_dict 

的問題是,當我new_dict(entrys_default=[])調用它,這樣在字典中的每個條目都與一個新的空列表作爲它的價值,創造了當我再更新returned_dict['a'].append(123)然後所有條目更新一個條目:

{'a': [123], 'b': [123], 'c': [123]} 

使用整數時,這不會發生,而且據我所知,這是因爲entrys_default是不可變的,當它是一個整數,但在同一列表的引用時,它是一個列表或字典。

我希望能夠使這個函數的工作方式與使用列表和字典的整數參數一樣工作,即entrys_default - 即每個條目都有它自己的列表/字典 - 但想要保持該函數的靈活性,以適用於整數。

任何人都可以請建議最好的方式去做這件事嗎?

回答

2

做什麼collections.defaultdict確實;而不是採取「示例」默認值,採取返回所需的默認值的功能。然後調用該函數並使用其返回值來初始化正在構建的dict的每個元素。

def new_dict(make_default=int): # int() == 0 
    my_dict = {} 
    for k in ['a', 'b', 'c']: 
     my_dict[k] = make_default() 
    return my_dict 

d = new_dict(list) # list() == [], but a distinct list each time it is called 
d['a'].append(123) 
assert d['a'] != d['b'] 
+0

完美,謝謝! – Scott