2017-02-07 10 views
4

値としてではなく参考としてdefaultdictに辞書を渡すだから私はこの問題は、デフォルトの辞書私は合格していることを別の辞書Pythonの - どのように

attributes = { 'first_name': None, 'last_name': None, 'calls': 0 } 
accounts = defaultdict(lambda: attributes) 

のデフォルト値を持つ辞書をされていることを言いますinto defaultdict(属性)が参照として渡されます。どのように値として渡すことができますか?私は唯一の「コールに対してそれぞれの値をインクリメントするので、私は、1を印刷するためにそれらのそれぞれをしたい

accounts[1]['calls'] = accounts[1]['calls'] + 1 
accounts[2]['calls'] = accounts[2]['calls'] + 1 
print accounts[1]['calls'] # prints 2 
print accounts[2]['calls'] # prints 2 

- つのキーの値を変更すると、例えば、他のキーの値

を変更しないように一度

+0

これは明示的にコピーを作成する必要があります。パラメータを渡すことは常に参照を渡すようなものです。 –

+0

Pythonには1つの唯一の評価戦略があります:[共有によって呼び出す](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。 –

+0

あなたはこのようになります:http://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-or-deep/3975388#3975388 – sangheestyle

答えて

8

試してみてください。Pythonの3.3以来

accounts = defaultdict(attributes.copy) 

listsalso have copy methodデフォルト値としてリストと辞書を必要とするときに、あなたがdefaultdict Sと上記のように、それを同じように使用することができます。

+3

ooooooo非常に賢い! –

+1

ファクトリは、(引数なしで呼び出すことができる限り)欠落しているキーに使用する値を返す関数であればどのような関数でもかまいません。 'attributes.copy'はちょうどそのような関数です! – kindall

+0

完璧に動作する – satnam

2

私は本当にウォルヴァリュークスのソリューションが好きです。ただし、dictdefaultdict ...に渡すことはないので、その引数は呼び出し可能なである必要があるため、TypeErrorになります。ラムダでリテラルを使ったことがあります。または、より良い方法は、ヘルパー関数を定義することです。

>>> def attribute(): 
...  return { 'first_name': None, 'last_name': None, 'calls': 0 } 
... 
>>> accounts = defaultdict(attribute) 
>>> accounts[1]['calls'] = accounts[1]['calls'] + 1 
>>> accounts[2]['calls'] = accounts[2]['calls'] + 1 
>>> print(accounts[1]['calls']) 
1 
>>> print(accounts[2]['calls']) 
1