对于Python中的循环,更改它循环的列表

对于Python中的循环,更改它循环的列表,python,for-loop,Python,For Loop,这是一个武断的例子。我想在条件失败时更改它现在正在循环的列表。我试过这样做。我不认为它实际上改变了它现在正在循环的列表。请纠正我。这是一个有趣的问题,因为您实际上没有改变列表 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: ####

这是一个武断的例子。我想在条件失败时更改它现在正在循环的列表。我试过这样做。我不认为它实际上改变了它现在正在循环的列表。请纠正我。

这是一个有趣的问题,因为您实际上没有改变列表

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.

因为您没有变异,所以您重新分配了对您正在迭代的列表的悬空引用,对于for循环的上下文来说,它最初仍然存在,并且它一直延续到列表2的末尾,这就是为什么您最终抛出
indexer
-第一个列表中有100个项目,第二个列表中只有20个。

非常简单,当您想要编辑正在迭代的列表时,应该使用该列表的副本。因此,您的代码只需传输到:

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

您可以对原始的cleanedList进行各种编辑,并且不会显示任何错误。

不建议更改正在循环的列表。但是,如果这是您真正想要的,那么您可以这样做:

for val in cleanedList[:]:

是什么让你认为它没有改变列表?@ScottHunter-是什么让你认为它改变了列表?@tdelaney:运行它你没有改变你正在迭代的列表。取而代之的是,你取了你用来引用该列表的名称,并将其含义更改为其他名称。实际上,更改列表看起来像是
cleanedList[:]=[x代表范围内的x(60100,2)]
。请注意,这通常是一个坏主意。你的问题的最佳解决方案不太可能需要。我正努力想知道你想要的结果是什么。如果check mod 5为零,您是否希望替换整个列表,然后中断循环?是否要继续将新列表追加到末尾,并有一个无限循环?你能举一个例子,比如说,10个元素以及预期的结果是什么吗<代码>dict和
设置
迭代器会,不过。是的。。。只是仔细检查了一下。你说得对。谢谢你的帮助。我认为这个例子相当武断。我想我想问的主要问题是,如果条件失败,我要更改循环的列表。为什么要这么麻烦,而不仅仅是
cleanedList[:]=range(60100,2)
?@abarnert是的,你是对的。我的错。固定的谢谢不幸的是,仍然是一个无意义的算法。谢谢你的帮助。我认为这个例子非常武断,我用这个例子来让我的问题更具体,并有意使用非理性算法。我想问的主要问题是,如果条件允许,请更改我循环的列表fails@Tom那么,我的回答是否显示了如何在循环列表时更改列表?@AGNGazer是的,它显示了。抱歉这么粗鲁。cleanedList[:]在这里做什么?它只是改变了列表中的所有内容?
for val in cleanedList[:]:
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)