我遇到了嵌套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)
这是我得到的输出:
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
这是我期待的输出:
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
似乎外部for循环中的i和内部for循环中的i是不同的变量,尽管这对我来说似乎完全违反直觉。
任何输入(我对python相当新,但无法找到相关文档)
答案 0 :(得分:9)
for
循环在每次循环迭代时为i
分配 new 值,即从循环迭代中获取的下一个值(在本例中为range(16)
)。
您可以在循环中修改i
,但这不会改变正在使用的可迭代for
。
如果你想改变循环可迭代,那么你必须在迭代上直接这样做:
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)
在这里,我们使用iterator object从range(10)
序列创建iter()
function; for
语句完全相同,但现在我们可以直接解决迭代器问题了。 next()
function将迭代器推进到下一个值,就像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
要记住的是,Python for
循环语句是 nothing ,如C或Java或JavaScript for
循环。这是一个Foreach loop。 range()
只是生成一系列数字来循环,而不是C风格的for
循环,它结合了初始赋值(i = 0
),test(i < 16)
)并将循环增量(i += 1
)放入一个语句中。