<p>引发了<code>StopIteration</code>,但元组赋值将其吞并,因为它将<code>StopIteration</code>视为来自<code>map()</code>迭代器的信号,该迭代器生成值:</p>
<pre><code>>>> i0, i1 = iter(['foo']), iter([])
>>> m = map(next, (i0, i1))
>>> next(m)
'foo'
>>> next(m)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> i0, i1 = iter(['foo']), iter([])
>>> m = map(next, (i0, i1))
>>> a, b = m
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 2, got 1)
</code></pre>
<p>这是正常的行为;期望迭代器作为输入的Python内置程序总是使用<code>StopIteration</code>作为“迭代完成”信号,元组解包必须在这里迭代。在</p>
<p>请先将<code>map()</code>输出转换为列表并测试长度,对每个iterable分别使用<code>next()</code>,而不是使用<code>map()</code>,或者在本地捕获{<cd8>}。在</p>
<p>测试长度必须重新提高<code>StopIteration</code>:</p>
^{pr2}$
<p>注意,这里<code>list()</code>吞并了<code>StopIteration</code>异常。在</p>
<p>仅为<code>map()</code>操作捕获<code>ValueError</code>:</p>
<pre><code>try:
a, b, c, d = map(next, (it0, it1, it2, it3))
except ValueError:
raise StopIteration
</code></pre>
<p>在每个迭代器上单独调用<code>next()</code>,根本不使用<code>map()</code>:</p>
<pre><code>a, b, c, d = next(it0), next(it1), next(it2), next(it3)
</code></pre>
<p>或者使用列表理解:</p>
<pre><code>a, b, c, d = [next(i) for i in (it0, it1, it2, it3)]
</code></pre>
<p>这两种方法都确保在赋值发生之前调用<code>next()</code>,而不是在赋值过程中调用。在</p>