我运行了这段代码,输出令人惊讶。我知道我正在重用我,我的问题是为什么自从我被重新分配后,第一次迭代后循环不退出!

码:

for i in range(3):
    print '====='
    print 'Outer I: ', i
    print '====='
    for j in range(2):
        print 'J', j
        for i in range(5):
            print 'Inner I', i
    print '====='
    print 'Outer I Again: ', i
    print '====='


输出:

=====
Outer I:  0
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4
=====
=====
Outer I:  1
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4
=====
=====
Outer I:  2
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4


这是令人困惑的事情:


我希望循环在第一次迭代后会中断,但是
才不是。
出于同样的原因,第一个打印语句“ Outer I”
打印正确的i值。
第二个外部印刷声明
“再次我外”打印错误的值。


我正在使用CPython在Python 2.7上运行它。

最佳答案

此代码中没有内部i或外部i,只有一个i变量在两个不同的循环中分配。
为什么循环在第一次迭代后就中断? Python的for基本上是其他语言中的for each循环,它在给定的迭代器或生成器的成员上进行迭代。 range函数返回元素[0,1,2,3,4]的列表,并且每次迭代i都从列表中获得下一个值,i的当前值与外循环无关紧要。

这就是为什么第一个Outer I打印您期望的i值,而第二个(内部循环之后)不打印的原因。

关于python - Python Block Scope-有人对此进行了解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40739741/

10-12 22:53