擅长:python、mysql、java
<p>解包操作任意的可重用项,而不是序列,它通过迭代来实现。当你这样做的时候</p>
<pre><code>(a, b, c) = bounded_naturals(3)
</code></pre>
<p>您要求Python迭代<code>bounded_naturals(3)</code>,并将结果分配给<code>a</code>、<code>b</code>和<code>c</code></p>
<hr/>
<p>像这样的多重赋值</p>
<pre><code>bn_gen = (a, b, c) = bounded_naturals(3)
</code></pre>
<p>工作原理是将RHS从左到右分配给每个分配目标(<em>不像其他一些语言那样从右到左)。生成器首先被分配到<code>bn_gen</code>,然后被分配到<code>(a, b, c)</code>。请注意,解包会耗尽生成器,因此对<code>bn_gen</code>进行迭代将不会得到任何结果</p>
<hr/>
<p>当你这样做的时候</p>
<pre><code>(a, b) = bounded_naturals(3)
</code></pre>
<p>失败与Python不聪明无关。Python不会自动丢弃额外的值,因为这只会隐藏bug。iterable必须提供与解包请求一样多的元素</p>
<p>记住,仅仅因为一些代码<em>可以</em>被赋予非错误含义,并不意味着它<em>应该</em></p>
<hr/>
<p>所有这些都记录在<a href="https://docs.python.org/3/reference/simple_stmts.html#assignment-statements" rel="noreferrer">assignment statement docs</a>中</p>