<p>python <code>for</code>循环计算产生iterable的表达式,该表达式只在该表达式上循环<strong>一次</strong>。您可以在循环中操作<code>lst</code>对象,而不会影响<code>for</code>循环的结果。这不同于Java <code>for</code>构造(它与Python<code>for</code>语句非常不同,它实际上是一个<a href="http://en.wikipedia.org/wiki/Foreach_loop" rel="nofollow">Foreach</a>构造),它为每个迭代计算3个相关的表达式。在</p>
<p>在第一个示例中,您创建了一个<code>range()</code>结果,一旦创建,它就不会为每个循环迭代更新。在</p>
<p>在第二个示例中,您使用一个全长切片(<code>lst[:]</code>)创建了一个<code>lst</code>的副本,以便循环进行迭代。不会为每个循环迭代重新创建副本。在</p>
<p>不过,这里有一个警告。<code>for</code>循环对要迭代的对象调用<a href="http://docs.python.org/2/library/functions.html#iter" rel="nofollow">^{<cd10>}</a>。对于列表对象,结果列表迭代器保留对原始列表的引用以及迭代索引。每当<code>for</code>循环向前推进迭代器(对其调用<a href="http://docs.python.org/2/library/functions.html#next" rel="nofollow">^{<cd12>}</a>),迭代索引就会递增并在原始列表中查找,直到索引等于列表长度。如果你继续在循环中添加到列表中,那么<em>将创建一个无限循环。在</p>
<p>如果您创建要迭代的列表副本,则可以看到:</p>
<pre><code>>>> L = [1, 2, 3]
>>> for i in L:
... L.append(4)
... print L
... if len(L) > 30:
... break
...
[1, 2, 3, 4]
[1, 2, 3, 4, 4]
[1, 2, 3, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
</code></pre>
<p>在这里,为<code>L</code>创建的迭代器继续生成下一个元素,因为<code>L</code>在循环中被扩展,如果我没有在循环中添加长度限制,这将一直持续下去。在</p>