cleanedList = [x for x in range(0, 100, 1)]
idx = 0
for val in cleanedList:
check = abs(cleanedList[idx])
idx = idx + 1
if check % 5 == 0: ##### Conditions changed and change the list
cleanedList = a new list that loops over.
这是任意的例子。我想在条件失败时更改它现在循环的列表。我试过这种方式。我不认为它实际上改变了它现在循环的列表。请纠正我。
答案 0 :(得分:0)
这是一个有趣的,因为你实际上没有改变列表。
cleanedList = [x for x in range(0, 100, 1)] # Creates list1
idx = 0
for val in cleanedList: # begin iterating list1. It's stored internally here.
check = abs(cleanedList[idx])
print val, check,
idx = idx + 1
if check < 30: ##### Change the list it is looping now
cleanedList = [x for x in range(60,100,2)] # reassign here, but it becomes list2.
输出讲述了这个故事:
0 0 1 62 2 64 3 66 4 68 5 70 6 72 7 74 8 76 9 78 10 80 11 82 12 84 13 86 14 88 15 90 16 92 17 94 18 96 19 98
因为你没有改变,你重新分配了,对于你最初迭代的列表的悬空引用仍然存在于for循环的上下文中,并且它继续超过列表2的末尾,这就是你最终抛出IndexError
的原因 - 你的第一个清单中有100个项目,而你的第二个清单中只有20个。
答案 1 :(得分:0)
非常简单地说,如果要编辑要迭代的列表,则应使用列表的副本。所以你的代码只需转移到:
for val in cleanedList[:]:
您可以在原始清洁列表上进行各种编辑,不会显示任何错误。
答案 2 :(得分:0)
不建议更改循环的列表。但是,如果这是真正想要的,那么你可以这样做:
cleanedList = list(range(0, 100, 1))
for i, _ in enumerate(cleanedList):
check = abs(cleanedList[i])
if check % 5 == 0: ##### Change the list it is looping now
cleanedList[:] = range(60, 100, 2)