のドキュメントを読んでくださいdict.setdefault
: のようですget
が、キーが存在しない場合は、それも設定されます:
>>> my_dict = {}
>>> my_dict.setdefault('some key', 'a value')
'a value'
>>> my_dict
{'some key': 'a value'}
>>> my_dict.get('some key2', 'a value2')
'a value2'
>>> my_dict
{'some key': 'a value'}
例を少し変更します。
>>> def what(*words):
... d = dict()
... for word in words:
... curr = d
... for letter in word:
... curr = curr.setdefault(letter, {})
... curr = curr.setdefault('.', '.')
... print 'curr is now: %r while d is %r' % (curr, d)
...
>>> what('foo')
curr is now: '.' while d is {'f': {'o': {'o': {'.': '.'}}}}
変更を見ることができるように、時々(あなたの例では常に)curr
呼び出すときに新しいを作成し、常に元のを参照しながら、新しいを作成して値として設定するためです。ご覧のとおり、値は とはかなり異なるため、ループの後に変更されます。setdefault
dict
curr
d
dict
{'f': {'o': {'o': {'.': '.'}}}}
{}
おそらくあなたの混乱は、curr = curr.setdefault(letter, {})
常に新しい空 のを作成しdict
、それが割り当てられるという事実によるものですcurr
(したがって、すべての文字に対してdict
、値を上書きするのではなく、オリジナルにネスト レベルを追加します)。
これを参照してください:
>>> my_dict = {}
>>> curr = my_dict
>>> for letter in 'foo':
... print 'my_dict is now %r. curr is now %r' % (my_dict, curr)
... curr = curr.setdefault(letter, {})
...
my_dict is now {}. curr is now {}
my_dict is now {'f': {}}. curr is now {}
my_dict is now {'f': {'o': {}}}. curr is now {}
>>> my_dict
{'f': {'o': {'o': {}}}}
すべてのレベルでわかるようにmy_dict
、新しいネスト レベルがあります。
たぶん、しかし私は推測していますが、あなたは のようなものを取得したかったの'foo' -> {'f': {}, 'o': {}}
です。
>>> my_dict = {}
>>> for letter in 'foo':
... my_dict.setdefault(letter, {})
...
>>> my_dict
{'o': {}, 'f': {}}