在python的两层循环中使用相同的变量时发生了什么?

nin*_*hut 7 python scope

我测试以下代码:

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次.看来,该变量iprint "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循环中,终止条件取决于迭代器.无论你对体内变量做什么都没关系,在每次迭代开始时,它都会被赋予迭代器的下一个值.

  • @VanPeer不,`id`属于*object*,而不是变量.相同的变量可以在任何给定时间引用不同的对象. (2认同)

mrC*_*ore 6

在内循环中,您为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)


Van*_*eer 3

注意输出总是如何

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)