2016-11-22 79 views
1

我跑這塊代碼和輸出是令人驚訝的。我知道我正在重複使用我,我的問題是爲什麼在我重新分配後的第一次迭代之後,循環沒有退出!Python塊範圍 - 有人解釋這

代碼:

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的正確值。
  • 第二個外部打印語句 「外面的我再次」打印錯誤的值。

我在Python 2.7上用CPython運行這個。

+0

你的代碼是錯誤的,你在內循環中重複使用'i'變量:'爲我在範圍內(5):' – EdChum

+0

做一件事,可能你會找到你想要的。用另一個變量** k **替換內部的i **。你會看到它會像魔術一樣工作! ;) –

+1

Python中沒有塊範圍。請參閱[範圍規則簡要說明](http://stackoverflow.com/questions/291978/short-description-of-scoping-rules)和[在Python中限制範圍](http://stackoverflow.com/questions/6167923/block-scope-in​​-python) –

回答

3

在此代碼中沒有內部i或外部i,有一個單獨的i變量分配在兩個不同的循環中。 爲什麼在第一次迭代之後循環會中斷? Python的for基本上是其他語言中的for each循環,它循環迭代器或給定生成器的成員。 range函數返回元素列表[0,1,2,3,4],並且每個迭代i被給出列表中的下一個值,當前值i對外部循環無關緊要。

這就是爲什麼第一個Outer I打印您期望的i值,但第二個(內循環後)不打印。

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 
===== 
0

您正在重複使用變量,但目標變量保持不變。在這種情況下,變量的範圍不會隨着裏面的i而改變。爲了處理像字符串或整數這樣的不可變對象,你不會面臨這個問題。使用一些其他變量,而不是第二個我,你會很好去。

+0

可變性與它無關 - 而實例* *實際上是用整數工作的,你指出它是不可變的。 –