擅长:python、mysql、java
<p>让我们用一个简单的例子来说明发生了什么:</p>
<pre><code>def my_func():
output = [1,2,3]
print("Output", output)
yield output
print("Let's now clear the output")
output.clear()
print("Cleared output", output)
result = my_func()
print("Result", result)
print("Result List", list(result))
</code></pre>
<p>输出:</p>
<pre><code>Result <generator object my_func at 0x7fd7ccc2a6d0>
Output [1, 2, 3]
Let's now clear the output
Cleared output []
Result List [[]]
</code></pre>
<ul>
<li>当它调用的函数本身(输出的第一行)时,生成器函数中的任何内容实际上都不会执行。你知道吗</li>
<li>当我们从生成器获取所有内容时(通过调用<code>list(result)</code>),我们运行生成器直到它到达函数的末尾,将所有<code>yield</code>结果放入列表中</li>
<li>如我们所见,由于函数中的所有内容现在都已执行,<code>output.clear()</code>方法也已执行。你知道吗</li>
<li><code>result</code>变量的内容与生成器函数末尾的<code>output</code>变量的内容匹配</li>
</ul>
<p>为了防止这种行为,一个简单的解决方案是返回一个我们正在返回的值的副本,这样我们以后就可以对它进行操作:<code>yield output[:]</code>(不过这是一个浅拷贝)</p>