<p>至于<strong>for</strong>循环中实际发生了什么:</p>
<blockquote>
<p><strong>From the</strong> <a href="https://docs.python.org/2/reference/compound_stmts.html#the-for-statement" rel="noreferrer"><strong>Python for statement documentation</strong></a>:</p>
<p>The expression list is evaluated <em>once</em>; it should yield an iterable
object. An iterator is created for the result of the <code>expression_list</code>.
The suite is then executed <em>once</em> for each item provided by the
iterator, <strong>in the order of ascending indices</strong>. Each item in turn is
assigned to the target <em>list</em> using the standard rules for assignments,
and then the suite is executed. <strong>When the items are exhausted</strong> (which is
immediately when the sequence is <strong>empty</strong>), the suite in the <code>else</code> clause,
if present, is executed, and the <code>loop</code> <strong>terminates</strong>.</p>
</blockquote>
<p>我认为最好借助一个<strong>插图来展示。在</p>
<p>现在,假设您有一个<code>iterable object</code>(例如<code>list</code>),如下所示:</p>
<pre><code>out = [a, b, c, d, e, f]
</code></pre>
<p>当你做<code>for x in out</code>时,它会创建内部索引器</strong>,如下所示(我用符号<code>^</code>来说明):</p>
^{pr2}$
<p>通常的情况是:当您完成循环的一个循环时,<strong>索引器向前移动</strong>,如下所示:</p>
<pre><code>[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 2
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 3
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 4
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 5
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 6
^ <-- here is the indexer
#finish, no element is found anymore!
</code></pre>
<blockquote>
<p>As you can see, the indexer <strong>keeps moving forward till the end of your
list, regardless of what happened to the list</strong>!</p>
</blockquote>
<p>因此,当您执行<code>remove</code>操作时,内部会发生以下情况:</p>
<pre><code>[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[b, c, d, e, f] #cycle 1 - a is removed!
^ <-- here is the indexer
[b, c, d, e, f] #cycle 2
^ <-- here is the indexer
[c, d, e, f] #cycle 2 - c is removed
^ <-- here is the indexer
[c, d, e, f] #cycle 3
^ <-- here is the indexer
[c, d, f] #cycle 3 - e is removed
^ <-- here is the indexer
#the for loop ends
</code></pre>
<p>请注意,那里只有<strong>3个周期</strong>,而不是<strong>6个周期</strong>(!!)(这是原始列表中元素的数目)。这就是为什么你留下了原来的<code>len</code>的一半,因为当你在每个循环中移除一个元素时,完成循环所需的周期数。在</p>
<hr/>
<p>如果要清除列表,只需执行以下操作:</p>
<pre><code>if (out != []):
out.clear()
</code></pre>
<p>或者,如果要逐个删除元素,则需要以相反的方式进行操作,即从末尾到开头</strong>。使用<code>reversed</code>:</p>
<pre><code>for x in reversed(out):
out.remove(x)
</code></pre>
<hr/>
<p>现在,为什么<code>reversed</code>会起作用?如果索引器继续前进,那么<code>reversed</code>是否也不应该工作,因为元素的数量在每个循环中减少了一个?在</p>
<p>不,不是那样的</p>
<blockquote>
<p>Because <code>reversed</code> method <strong>changes</strong> the way to the internal indexer
works! What happened when you use <code>reversed</code> method is <strong>to make the
internal indexer moves backward</strong> (from the end) instead of
<strong>forward</strong>.</p>
</blockquote>
<p>举例来说,这是通常发生的情况:</p>
<pre><code>[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 2
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 3
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 4
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 5
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 6
^ <-- here is the indexer
#finish, no element is found anymore!
</code></pre>
<p>因此,当每个周期执行一次删除操作时,它不会影响索引器的工作方式:</p>
<pre><code>[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[a, b, c, d, e] #cycle 1 - f is removed
^ <-- here is the indexer
[a, b, c, d, e] #cycle 2
^ <-- here is the indexer
[a, b, c, d] #cycle 2 - e is removed
^ <-- here is the indexer
[a, b, c, d] #cycle 3
^ <-- here is the indexer
[a, b, c] #cycle 3 - d is removed
^ <-- here is the indexer
[a, b, c] #cycle 4
^ <-- here is the indexer
[a, b] #cycle 4 - c is removed
^ <-- here is the indexer
[a, b] #cycle 5
^ <-- here is the indexer
[a] #cycle 5 - b is removed
^ <-- here is the indexer
[a] #cycle 6
^ <-- here is the indexer
[] #cycle 6 - a is removed
^ <-- here is the indexer
</code></pre>
<p>希望这张图能帮助你了解内部的情况。。。在</p>