"never modify something while you iterate over it."
----futurecoder
原因是——在列表上迭代仍然要遍历底层的索引。
错误示范:
numbers = [10, 7, 8, 3, 12, 15]
for number in numbers:
if number <= 10:
numbers.remove(number)
print(numbers)
正确输出是[12,15],实际输出是[7,3,12,15],修改后7、3的索引变成0、1,程序以为已经遍历过,所以判断不需要遍历,则从索引2开始遍历,则7、3被跳过。
有多种方法解决该问题,其一:将原始列表拷贝再遍历,修改拷贝的列表。
numbers = [10, 7, 8, 3, 12, 15]
big_numbers = numbers.copy()
for number in numbers:
if number <= 10:
big_numbers.remove(number)
print(big_numbers)
其二:创建空列表,反向思维将原始列表中大于目标值的值,添加到空列表,改变的并不是被遍历的列表。
numbers = [10, 7, 8, 3, 12, 15]
big_numbers = []
for number in numbers:
if number > 10:
big_numbers.append(number)
print(big_numbers)
综上所述,该问题你的选择有以下几种:
- 修改副本
- 迭代副本
- 不要修改任何内容,而是制作一个新版本