Python嵌套用于循环行为

kbr*_*oos 4 python for-loop nested-loops

我遇到了嵌套for循环这种奇怪的行为,我无法解释这个问题.这是一个特定于python的东西还是我只是在监督某些事情?

这是我正在运行的代码:

for i in range(16):
    if i == 0:
        for j in range(8):
            print 'i is (if) ' + str(i)
            i = i + 1
    else:
        print 'i is (else)' + str(i)
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

i is (if) 0
i is (if) 1
i is (if) 2
i is (if) 3
i is (if) 4
i is (if) 5
i is (if) 6
i is (if) 7
i is (else)1
i is (else)2
i is (else)3
i is (else)4
i is (else)5
i is (else)6
i is (else)7
i is (else)8
i is (else)9
i is (else)10
i is (else)11
i is (else)12
i is (else)13
i is (else)14
i is (else)15
Run Code Online (Sandbox Code Playgroud)

这是我期待的输出:

i is (if) 0
i is (if) 1
i is (if) 2
i is (if) 3
i is (if) 4
i is (if) 5
i is (if) 6
i is (if) 7
i is (else)8
i is (else)9
i is (else)10
i is (else)11
i is (else)12
i is (else)13
i is (else)14
i is (else)15
Run Code Online (Sandbox Code Playgroud)

看起来像外部for循环中的i和内部for循环中的i是不同的变量,尽管这对我来说似乎完全违反直觉.

任何输入(我对python很新,但找不到相关的文档)

Mar*_*ers 9

for循环分配一个值,i每次循环,即从循环迭代(在这种情况下采取的下一个值range(16).

您可以i在循环中进行修改,但这不会改变迭代for正在使用.

如果你想改变循环迭代,那么你必须直接在iterable上这样做:

loop_iterable = iter(range(16))
for i in loop_iterable:
    if i == 0:
        for j in range(8):
            print 'i is (if) ' + str(i)
            i = next(loop_iterable)
    else:
        print 'i is (else)' + str(i)
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用函数从序列中创建一个迭代器对象 ; 该语句做同样的事情在引擎盖下,但现在我们可以直接解决的迭代器.该函数将迭代器推进到下一个值,就像循环一样.range(10)iter()fornext()for

但是,使用while循环可能更容易:

i = 0
while i < 16:
    if i == 0:
        for j in range(8):
            print 'i is (if) ' + str(i)
            i = next(loop_iterable)
    else:
        print 'i is (else)' + str(i)
    i += 1
Run Code Online (Sandbox Code Playgroud)

要记住的一点是,Python的for循环语句是没有像C或Java或JavaScript for循环.这是一个Foreach循环.range()只需生成一个循环的数字序列,而不是C风格的for循环,它将初始赋值(i = 0),test(i < 16))和循环增量(i += 1)组合成一个语句.