我测试以下代码:
for i in range(3):
for i in range(3,5):
print "inner i: %d"%(i)
print "outer i: %d"%(i)
Run Code Online (Sandbox Code Playgroud)
输出是:
inner i: 3
inner i: 4
outer i: 4
inner i: 3
inner i: 4
outer i: 4
inner i: 3
inner i: 4
outer i: 4
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在外循环中i是4但外循环仍然运行3次.看来,该变量i的print "outer i: %d"%(i)行是i在内部循环,但是当进入到for i in range(3)它使用外循环的我.
有谁能解释一下?现在对我来说有点困惑.
jua*_*aga 13
它是一样的i,Python没有块范围.在每个for循环迭代开始时,将迭代器中的下一个值赋给i.Python for循环不像C/Java for循环,它们是foreach循环.继续直到迭代器耗尽(或者你break以某种方式).for循环等效于以下while循环:
iterator = iter(my_iterable)
while True:
try:
x = next(iterator)
except StopIteration:
break
do_stuff(x)
Run Code Online (Sandbox Code Playgroud)
所以,你的嵌套循环相当于:
it1 = iter(range(3))
while True:
try:
i = next(it1)
except StopIteration:
break
it2 = iter(range(3, 5))
while True:
try:
i = next(it2)
except StopIteration:
break
print "inner i: %d"%(i)
print "outer i after: %d"%(i)
Run Code Online (Sandbox Code Playgroud)
注意,C/Java for循环,例如:
for (int i = 0; i < stop; i++){
do_stuff(i);
}
Run Code Online (Sandbox Code Playgroud)
将在Python中:
i = 0
while i < stop:
do_stuff(i)
i += 1
Run Code Online (Sandbox Code Playgroud)
换句话说,经典循环取决于i,即终止条件取决于的值i.但是在for-each循环中,终止条件取决于迭代器.无论你对体内变量做什么都没关系,在每次迭代开始时,它都会被赋予迭代器的下一个值.
在内循环中,您为i分配了一个不同的变量.因为它是相同的变量,所以总是打印4(在内循环中分配的最后一个值.但是,当你进入外循环的下一次迭代时,它将被设置为下一个值(即第二个外循环的2)你应该在内环之前打印外环以更清楚地看到效果:
for i in range(3):
print "outer i before:%d"%(i)
for i in range(3,5):
print "inner i: %d"%(i)
print "outer i after: %d"%(i)
Run Code Online (Sandbox Code Playgroud)
注意输出总是如何
inner i: 3
inner i: 4
outer i: 4
Run Code Online (Sandbox Code Playgroud)
对于每个外循环。
该程序在每次迭代中取最终值i。
IE。当外部循环开始执行时,i是 0、1 或 2,但 的值i在内部 for 循环中被修改,并被打印。
更新:
for i in range(3):
for i in range(3,5):
print (id(i))
print (id(i))
Run Code Online (Sandbox Code Playgroud)
输出
1372154016
1372154032
1372154032
1372154016
1372154032
1372154032
1372154016
1372154032
1372154032
Run Code Online (Sandbox Code Playgroud)