对于循环行为

时间:2015-10-31 08:53:27

标签: python for-loop

这很奇怪。

a = range(10)

def remove_pop():
  global a
  a.pop()

for i in a:
  remove_pop()
  print i,

print '\n',a

0 1 2 3 4 
[0, 1, 2, 3, 4]

为什么循环过早退出?只有在a清空后它才会退出吗?

3 个答案:

答案 0 :(得分:1)

一旦索引i大于列表中的元素数,循环就会停止迭代。你弹出了5个元素,所以一旦列表大小和你的索引都等于5,它就会停止迭代

答案 1 :(得分:0)

首先,正如我在评论中所说。让我们尝试运行您的代码:

a = range(10) # now, a is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].

...

for i in a:
    remove_pop()

现在,第一个循环a将变为[0, 1, 2, 3, 4, 5, 6, 7, 8]for仍然保持读取a

让我们看看循环:

  1. for读取第一个元素,a[1, 2, 3, 4, 5, 6, 7, 8, 9]remove_pop()将删除9,因此列表循环现在看起来像这样:[1, 2, 3, 4, 5, 6, 7, 8]。但真正的列表是[0, 1, 2, 3, 4, 5, 6, 7, 8]

  2. for阅读1remove_pop()删除8。现在列表如下:[2, 3, 4, 5, 6, 7]。但真正的列表是[0, 1, 2, 3, 4, 5, 6, 7]

  3. ...

    1. for阅读4remove_pop()删除5。此循环中的列表现在为空,因为for只读取了元素,但它们并未删除它们,因此a现在为[0, 1, 2, 3, 4]

答案 2 :(得分:0)

最初有一个{0.1.2.3.4.5.6.7.8.9},然后在每次迭代中你删除一个元素作为pop从列表中删除最后一个元素

见输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0 [0, 1, 2, 3, 4, 5, 6, 7, 8]
1 [0, 1, 2, 3, 4, 5, 6, 7]
2 [0, 1, 2, 3, 4, 5, 6]
3 [0, 1, 2, 3, 4, 5]
4

此时for循环索引等于大小。所以循环退出,因为没有要迭代的元素。