假设我有一个for循环:
for i in range(1,10):
if i is 5:
i = 7
如果符合某些条件,我想更改i
。我尝试了这个,但没有奏效。
我该怎么做呢?
答案 0 :(得分:62)
对于您的特定示例,这将起作用:
for i in range(1, 10):
if i in (5, 6):
continue
但是,使用while
循环可能会更好:
i = 1
while i < 10:
if i == 5:
i = 7
# other code
i += 1
for
循环在每次迭代开始时将变量(在本例中为i
)分配给list / iterable中的下一个元素。这意味着无论你在循环中做什么,i
都将成为下一个元素。 while
循环没有这样的限制。
答案 1 :(得分:13)
关于为什么问题中的循环不能按预期工作的更多背景知识。
循环
match-data
基本上是
的简写for i in iterable:
# some code with i
因此iterator = iter(iterable)
while True:
try:
i = next(iterator)
except StopIteration:
break
# some code with i
循环从迭代构造的迭代器中逐一提取值,并自动识别迭代器何时耗尽并停止。
正如您所看到的,在for
循环的每次迭代中我被重新分配,因此无论您在其中发布的任何其他重新分配,都会覆盖while
的值i
部分。
由于这个原因,Python中的# some code with i
循环不适合循环变量的永久性更改,你应该使用for
循环,这已经在Volatility中得到证明了。答案。
答案 2 :(得分:2)
这个概念在C世界并不罕见,但如果可能应该避免。 尽管如此,这是我实施它的方式,我觉得很清楚发生了什么。然后你可以把你的逻辑用于在循环内的任何地方的索引中向前跳过,并且读者将知道要注意跳过变量,而在某个深处嵌入i = 7很容易被遗漏:
skip = 0
for i in range(1,10):
if skip:
skip -= 1
continue
if i=5:
skip = 2
<other stuff>
答案 3 :(得分:0)
一个简单的想法是,无论循环内部分配了什么值,i都会在每次迭代后获取一个值,因为循环在迭代结束时会增加迭代变量,并且由于i的值是在循环内部声明的,因此只是被覆盖。您可能想要将我分配给另一个变量并对其进行更改。例如,
for i in range(1,10):
if i == 5:
u = 7
,然后您可以在循环中使用“ break”来中断循环,以防止进一步迭代,因为它满足了所需条件。
答案 4 :(得分:0)
正如 timgeb 解释的那样,您使用的索引每次在 for 循环开始时都会被分配一个新值,我发现可行的方法是使用另一个索引。
例如,这是您的原始代码:
for i in range(1,10):
if i is 5:
i = 7
你可以用这个代替:
i = 1
j = i
for i in range(1,10):
i = j
j += 1
if i == 5:
j = 7
此外,如果您在 for 循环中修改列表中的元素,如果您在其中添加或删除元素,您可能还需要在每个循环结束时将范围更新为 range(len(list)) 。我这样做的方式就像,分配另一个索引来跟踪它。
list1 = [5,10,15,20,25,30,35,40,45,50]
i = 0
j = i
k = range(len(list1))
for i in k:
i = j
j += 1
if i == 5:
j = 7
if list1[i] == 20:
list1.append(int(100))
# suppose you remove or add some elements in the list at here,
# so now the length of the list has changed
k = range(len(list1))
# we use the range function to update the length of the list again at here
# and save it in the variable k
不过,使用 while 循环还是会更方便。 无论如何,我希望这会有所帮助。