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