我运行了这段代码,输出结果令人惊讶。我知道我正在重复使用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
以下是令人困惑的事情:
我正在使用CPython在Python 2.7上运行它。
答案 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而变化。对于使用字符串或整数等不可变对象,您不会遇到问题。使用其他变量而不是第二个变量,你就可以了。