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时,退出循环的原因是什么?
答案 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]