擅长:python、mysql、java
<p>首先,<code>yield</code>返回什么?本例中的答案是<code>None</code>,因为<code>yield</code>返回传递给<code>next()</code>的参数,这在本例中是没有的(<code>list</code>没有传递给<code>next</code>)。</p>
<p>现在你的答案是:</p>
<pre><code>>>> myset = set(['a', 'b', 'c', 'd'])
>>> mydict = {item: (yield ''.join([item, 's'])) for item in myset}
>>> mydict
<generator object <dictcomp> at 0x0222BB20>
</code></pre>
<p>dict理解被转换成生成器,因为您在函数体上下文中使用了<code>yield</code>!这意味着整个东西在传递到<code>list</code>之前不会被计算。</p>
<p>接下来发生了什么:</p>
<ol>
<li><code>list</code>调用<code>next(mydict)</code>。</li>
<li>Yield返回<code>''.join([item, 's'])</code>到<code>list</code>并冻结理解。</li>
<li><code>list</code>调用<code>next(mydict)</code>。</li>
<li>理解恢复并将字典中<code>yield</code>(<code>None</code>)的结果赋给<code>item</code>,并开始新的理解迭代。</li>
<li>回到1。</li>
</ol>
<p>最后,实际的生成器对象返回主体中的临时对象,即<code>dict</code>。我不知道为什么会发生这种事,也可能没有记录在案的行为。</p>