擅长:python、mysql、java
<p>当您迭代<code>for subitem in flatten(item)</code>时,调用返回到<code>flatten</code>,它首先打印项目<code>yield2 value</code>,然后您在循环中使用<code>yield1 value</code>再次打印它,这就是为什么,它会被打印两次,一次用于yield1,一次用于yield2,并且它不会像您在问题标题中提到的那样向上堆叠</p>
<p>另一方面,建议使用<code>yield from ...</code>对生成器进行递归调用,而不是手动迭代生成器调用</p>
<pre class="lang-py prettyprint-override"><code>def flatten(lol):
for item in lol:
if isinstance(item, list):
yield from flatten(item)
# for subitem in flatten(item):
# print('yield1 ', subitem)
# yield subitem
else:
print('yield2 ', item)
yield item
lol = [1, 2, [3, 4, 5], [6, [7, 8, 9], []]]
list(flatten(lol))
</code></pre>
<p><strong>输出:</strong></p>
<pre class="lang-py prettyprint-override"><code>yield2 1
yield2 2
yield2 3
yield2 4
yield2 5
yield2 6
yield2 7
yield2 8
yield2 9
[1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre>