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很新,但找不到相关的文档)
该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)组合成一个语句.