<p>不应从循环的列表中删除项。改为创建副本:</p>
<pre><code>for a in aliens[:]:
</code></pre>
<p>以及</p>
<pre><code>for b in bolts[:]:
</code></pre>
<p>在列表上循环时修改列表会影响循环:</p>
<pre><code>>>> lst = [1, 2, 3]
>>> for i in lst:
... print i
... lst.remove(i)
...
1
3
>>> lst
[2]
</code></pre>
<p>从循环两次的列表中删除项会使事情更加复杂,从而导致值错误:</p>
<pre><code>>>> lst = [1, 2, 3]
>>> for i in lst:
... for a in lst:
... print i, a, lst
... lst.remove(i)
...
1 1 [1, 2, 3]
1 3 [2, 3]
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError: list.remove(x): x not in list
</code></pre>
<p>在循环的每个<em>级别创建要修改的列表副本时,可以避免以下问题:</p>
<pre><code>>>> lst = [1, 2, 3]
>>> for i in lst[:]:
... for i in lst[:]:
... print i, lst
... lst.remove(i)
...
1 [1, 2, 3]
2 [2, 3]
3 [3]
</code></pre>
<p>当你发生碰撞时,你只需要移除一次螺栓,而不是在伤害外星人的回路中。以后把外星人分开清理:</p>
<pre><code>def manage_collide(bolts, aliens):
for b in bolts[:]:
for a in aliens:
if b['rect'].colliderect(a['rect']) and a['health'] > 0:
bolts.remove(b)
for a in aliens:
a['health'] -= 1
for a in aliens[:]:
if a['health'] <= 0:
aliens.remove(a)
return bolts, aliens
</code></pre>