<p>阅读<a href="http://docs.python.org/2/library/stdtypes.html#dict.setdefault" rel="noreferrer">^{<cd1>}</a>的文档:它类似于<code>get</code>,但如果密钥不存在,则它也会被设置:</p>
<pre><code>>>> 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'}
</code></pre>
<p>稍微修改一下你的例子:</p>
<pre><code>>>> 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': {'.': '.'}}}}
</code></pre>
<p>正如您所看到的<code>curr</code>更改,因为当调用<code>setdefault</code>时,它有时(在您的示例中总是)创建一个新的<code>dict</code>,并将其设置为<code>curr</code>的值,而<code>d</code>总是引用原始的<code>dict</code>。正如您所看到的,它在循环之后被修改,因为它的值是<code>{'f': {'o': {'o': {'.': '.'}}}}</code>,这与<code>{}</code>非常不同。</p>
<p>可能您的困惑是因为<code>curr = curr.setdefault(letter, {})</code><strong>总是</strong>创建一个<strong>新的</strong>和<strong>空的</strong><code>dict</code>,然后将其分配给<code>curr</code>(因此,对于每个字母,您将嵌套级别添加到原始<code>dict</code>,而不是覆盖值)。</p>
<p>请参阅:</p>
<pre><code>>>> 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': {}}}}
</code></pre>
<p>如您所见,对于每个级别,<code>my_dict</code>都有一个新的嵌套级别。</p>
<p>也许吧,但我只是猜测,你想得到类似<code>'foo' -> {'f': {}, 'o': {}}</code>的东西,在这种情况下,你应该:</p>
<pre><code>>>> my_dict = {}
>>> for letter in 'foo':
... my_dict.setdefault(letter, {})
...
>>> my_dict
{'o': {}, 'f': {}}
</code></pre>