为什么要在删除列表中的所有项目之前停止for循环?

时间:2018-10-25 15:10:54

标签: python list for-loop

L = 10*[1]
for l in L:
    L.remove(l)
print(L)

为什么print(L)返回原始列表L的5个项?我正在调试器中查找,本地和全局(L)的len是5,而L.remove(1)是对列表[1,1,1,1,1]的有效操作,对吗?当len(L)为5时,退出循环的原因是什么?

1 个答案:

答案 0 :(得分:4)

这是因为您正在迭代列表L时对其进行了变异。删除5项后,您便不再需要任何其他索引来进行循环迭代。循环将列表的索引位置从索引位置0迭代到列表中的最后一个索引。由于要在每次迭代过程中删除项目,因此要更改列表中项目的索引位置,但这不会更改循环将迭代的下一个索引值。

如果您有一个包含唯一项值(例如[1,2,3,4,5,6,7,8,9,10])的列表,则更容易查看。在第一次迭代中,您删除了将列表更改为1的项目值[2,3,4,5,6,7,8,9,10],然后第二次迭代到达了索引位置1,现在是项目值3,然后删除了该项目。 / p>

循环结束后,您将删除所有奇数项(保留[2, 4, 6, 8, 10]),并且循环将停止,因为列表中不再存在索引位置5。

这里是一个如何在实践中工作的示例:

items = [1,2,3,4,5,6,7,8,9,10]

for i, item in enumerate(items):
    print(f'Iterating over index {i} where item value {item}')
    print(f'Next item: {items[i+1]}')
    items.remove(item)
    if i < len(items) - 1:
        print(f'Oops, next item changed to {items[i+1]} because I removed an item.')
    else:
        print('Oops, no more items because I removed an item.')

print(f'Mutated list after loop completed: {items}')

# OUTPUT
# Iterating over index 0 where item value 1
# Next item: 2
# Oops, next item changed to 3 because I removed an item.
# Iterating over index 1 where item value 3
# Next item: 4
# Oops, next item changed to 5 because I removed an item.
# Iterating over index 2 where item value 5
# Next item: 6
# Oops, next item changed to 7 because I removed an item.
# Iterating over index 3 where item value 7
# Next item: 8
# Oops, next item changed to 9 because I removed an item.
# Iterating over index 4 where item value 9
# Next item: 10
# Oops, no more items because I removed an item.
# Mutated list after loop completed: [2, 4, 6, 8, 10]