直到列表的末尾索引才会运行for循环

时间:2019-08-09 08:05:46

标签: python

下面的代码仅运行两次。不知道为什么会这样。

a=[1,2,3,4]
count=0
for letter in a:
    print(letter)
    b=a.pop()

    count+=1
print("total loop count is "+str(count))

我希望循环应该运行四次。 如果我注释/删除行b=a.pop(),则循环运行四次。

我希望程序退出循环后计数的打印数应该是四,但是计数的实际输出打印数是2。

5 个答案:

答案 0 :(得分:7)

不带参数的list.pop()方法将删除列表的最后一项。检出the documentation

所以基本上发生的是:

  • 循环1(字母1、4被删除)
  • 循环2(字母2、3已删除)
  • 没有循环3,因为列表a没有更多元素。

通常,在迭代集合的元素时修改集合是一种不好的做法。这样做通常会导致意想不到的行为。

答案 1 :(得分:2)

第一步: 打印第一个元素,删除第四个元素

第二步: 打印第二个元素,删除第三个元素

...没有元素可打印。

答案 2 :(得分:0)

因为您使用以下行更改了迭代器a的元素大小:

b=a.pop()

每次运行该行时,列表a将删除其最后一个元素,并且其大小将减小1。

获得期望的最简单方法是使迭代器在第3行for letter in a[:]不变:

a=[1,2,3,4]
count=0
for letter in a[:]:
    print(letter)
    b=a.pop()

    count+=1
print("total loop count is "+str(count))

,输出将正确:

1
2
3
4
total loop count is 4

答案 3 :(得分:0)

一些改进的代码

a=[1,2,3,4]
count=0
while len(a)>0:
    count+=1
    print(a[-1])
    a.pop()

print("total loop count is {}".format(count))

答案 4 :(得分:0)

只是了解概念。使用 enumerate()知道迭代的次数,第二次调用pop时, len(a)变为2(这意味着没有第三项进行第三次迭代打印)。 运行下面的代码一次以获得更好的主意。建议不要在for循环内的列表中弹出或删除。

count=0
for iteration_count,letter in enumerate(a):
    print("Index Value:",iteration_count)
    b=a.pop()
    print("Length of a:",len(a))
    count+=1
print("total loop count is "+str(count))

以下代码可以帮助您弹出所有项目。

count=0
while a:
    a.pop()
    print(a)