Python块范围 - 有人解释这一点

时间:2016-11-22 10:43:27

标签: python scope

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

代码:

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的正确值。
  • 第二个外部印刷声明 “Outer I Again”打印错误的值。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

您正在重复使用内循环中的i变量:

for i in range(5)

所以你看到了:

Outer I Again:  4

如果将其更改为其他变量名称,则按预期工作:

In [12]:
for i in range(3):
    print( '=====')
    print( 'Outer I: ', i)
    print( '=====')
    for j in range(2):
        print( 'J', j)
        for l in range(5):
            print( 'Inner I', l)
    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:  0
=====
=====
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:  1
=====
=====
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:  2
=====

答案 2 :(得分:0)

您正在重复使用变量,但目标变量保持不变。在这种情况下,变量的范围不随内部i而变化。对于使用字符串或整数等不可变对象,您不会遇到问题。使用其他变量而不是第二个变量,你就可以了。