2017-05-25 3 views
0

特定のキーを持つ辞書を作成する機能があります。これは、各キーの「デフォルト」値を指定するためのパラメータを受け入れます。問題は、私はnew_dict(entrys_default=[])とそれを呼び出すとき、私はその後、returned_dict['a'].append(123)と一つのエントリを更新するときに、辞書の各エントリは、その値として、新しい空のリストを使用して作成されるように、その後すべてエントリが更新されていることであるデフォルト値が不変または変更可能な辞書を作成する機能

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

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

整数を使用するとき、これは発生しません、と私は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

関連する問題