擅长:python、mysql、java
<p>在阅读函数时,我试图找出调用将产生什么结果。让我们从完整的原始代码开始:</p>
<pre><code>def P(n):
if n == 0:
yield []
return
for p in P(n-1):
p.append(1)
yield p
p.pop()
if p and (len(p) < 2 or p[-2] > p[-1]):
p[-1] += 1
yield p
print(P(5)) # this line doesn't make sense
</code></pre>
<p>好的,它调用<code>P(5)</code>。因为那不是0,P递归,直到我们到达<code>P(0)</code>,它产生一个空列表。这是<code>p</code>第一次收到值。然后<code>P(1)</code>将<code>1</code>追加到该列表中,并将其交给<code>P(2)</code>,后者将重复该过程。。等等。所有相同的列表,最初由<code>P(0)</code>创建,最终由<code>P(5)</code>生成<code>[1,1,1,1,1]</code>,但随后奇迹发生了。让我们把这个第一个列表称为<code>l0</code>。在</p>
<p>当您向生成器请求第二项时,control返回到<code>P(5)</code>,它现在从<code>l0</code>中删除一个值。根据一系列条件,它可能会增加最后一个值并再次生成<code>p</code>,也就是<code>l0</code>。所以我们收到的第一件商品在我们要求第二件商品的时候一直在变。这最终将终止,但意味着这两者之间存在差异:</p>
^{pr2}$
<p>这就是为什么我把它称为post modification;它返回的值在产生之后会不断变化(因为它们实际上是被操纵的同一个对象)。在</p>