如何在Python中更改for循环的索引?

dru*_*rum 46 python for-loop

假设我有一个for循环:

for i in range(1,10):
    if i is 5:
        i = 7
Run Code Online (Sandbox Code Playgroud)

i如果它符合某些条件我想改变.我尝试了这个,但没有奏效.我该怎么办呢?

Vol*_*ity 73

对于您的特定示例,这将工作:

for i in range(1, 10):
    if i in (5, 6):
        continue
Run Code Online (Sandbox Code Playgroud)

但是,你可能会更好地使用while循环:

i = 1
while i < 10:
    if i == 5:
        i = 7
    # other code
    i += 1
Run Code Online (Sandbox Code Playgroud)

for环分配一个变量(在这种情况下,i在列表/在每个迭代开始迭代)到下一个元素.这意味着无论你在循环内做什么,i都将成为下一个元素.该while循环有没有这样的限制.

  • @drum:想要从循环内部手动更改循环索引感觉很乱. (19认同)
  • 这是唯一的方法吗?感觉有点凌乱. (3认同)
  • 至少使用`while`,我们不会将它误认为是在它承诺迭代的范围内迭代的"常规"循环. (2认同)
  • @BrenBarn有些凌乱是唯一的方法 (2认同)

tim*_*geb 17

关于为什么问题中的循环不能按预期工作的更多背景知识.

一个循环

for i in iterable: 
    # some code with i
Run Code Online (Sandbox Code Playgroud)

基本的速记

iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i
Run Code Online (Sandbox Code Playgroud)

因此for循环从迭代构造的迭代器中逐一提取值,并自动识别迭代器何时耗尽并停止.

正如你所看到的,在每次迭代while循环我被重新分配,因此价值i,无论您在发出任何其他的重新分配将被覆盖# some code with i的部分.

出于这个原因,forPython中的循环不适合循环变量的永久更改,你应该使用while循环代替,就像在Volatility的答案中已经证明的那样.

  • 很棒的细节。为了帮助初学者,不要将“无论如何,i 的值都会被覆盖”与“覆盖可迭代”混淆。如果你的“# some code with i”改变了iterable,它就会产生影响。 (2认同)