【发布时间】:2016-11-22 10:43:27
【问题描述】:
我运行了这段代码,结果令人惊讶。我知道我正在重用 i,我的问题是为什么循环在第一次迭代后没有退出,因为 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 上运行它。
【问题讨论】:
-
您的代码错误,您在内部循环中重用了
i变量:for i in range(5): -
做一件事,也许你会找到你想要的。用另一个变量 k 替换 inner i。你会看到它会像魔术一样工作! ;)
-
Python 中没有块作用域。见Short Description of Scoping Rules 和Block scope in Python