私はこのコードブロックを実行しましたが、出力は驚くべきものでした。私は私が私を再利用していることを知っている、私の質問はなぜ私は再割り当てされて以来、最初の反復後にループが終了しない!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
ここでは混乱しているものです:
- 私はループが最初の反復の後に壊れることを期待するが、それ ではない。
- 同じ理由で、最初の印刷ステートメント "外部I" がiの正しい値を出力します。
- 2番目の外側の印刷ステートメント "外側に戻る"は、間違った値を印刷します。
私はこれをPython 2.7 with CPythonで実行しています。
あなたのコードは間違っています。内部ループに 'i'変数を再利用しています:' iの範囲(5): ' – EdChum
はおそらくあなたが望むものを見つけるでしょう。 ** inner i **を別の変数** k **に置き換えます。それは魔法のように動作することがわかります!! ;) –
Pythonにブロックスコープはありません。 [Scoping Rulesの簡単な説明](http://stackoverflow.com/questions/291978/short-description-of-scoping-rules)と[Pythonのブロックスコープ](http://stackoverflow.com/questions/6167923)を参照してください。/block-scope-in-python) –