Python块作用域-有人解释一下吗

Python块作用域-有人解释一下吗,python,scope,Python,Scope,我运行了这段代码,结果令人惊讶。我知道我在重用I,我的问题是,既然我被重新分配了任务,为什么循环在第一次迭代后不退出呢 代码: 输出: ===== 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 ==

我运行了这段代码,结果令人惊讶。我知道我在重用I,我的问题是,既然我被重新分配了任务,为什么循环在第一次迭代后不退出呢

代码:

输出:

=====
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
以下是令人困惑的事情:

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

我正在Python 2.7上运行这个程序。

您正在重用内部循环中的
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
=====

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

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


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

您的代码是错误的,您在内部循环中重用
I
变量:
对于范围(5)中的I:
做一件事,您可能会找到您想要的。用另一个变量k替换内部i。你会看到它会像魔术一样工作!!;)Python中没有块作用域。请看,可变性与此无关——这个例子实际上是在处理整数,您指出整数是不可变的。
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
=====