在Python中循环,更改它循环的列表

时间:2018-05-29 23:57:08

标签: 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: #####  Conditions changed and change the list

       cleanedList = a new list that loops over.

这是任意的例子。我想在条件失败时更改它现在循环的列表。我试过这种方式。我不认为它实际上改变了它现在循环的列表。请纠正我。

3 个答案:

答案 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)