いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Pythonのforループのカウンタについて。ちょっと驚きました……。

 Pythonの話です。次のプログラム、実行結果はどうなるかご存じですか?

for i in range(10):
    print('i = ', i)
    if i == 3:
        i = 8

変数 i の値を0,1,2,……と1刻みで増やしながら表示します。3になったら i の値は8にセット。そのまま、i が9になるまで繰り返します。簡単なプログラムです。……と思っていたら、これのおかげでバグが出てしばらくハマりました。Cだったら(Basicなども)i は0,1,2,3,8,9と変化するところです。4,5,6,7にはならないのです。しかし Python では i = 8 としたときにはいったん8になりますが、ループの先頭に戻ったときに i は4になってしまうのです。Cでは「ループ内では制御変数の値は変更しない方が安全」みたいに言われるようですが、場合によるでしょう。その方が見やすい、ってこともあるはずです。そのつもりでPythonでやったらこちらの知らないところでカウンタが元に戻されていた、ということです。「i in リスト」みたいな書き方を見ると、ことによると勝手にカウンタは変更されたくないというのがあるかも、という気はしますが(例えば効率的にカウントアップする仕組みがあって、カウンタだけを変えられては困る、とか)。あ、もちろん上のプログラムは説明のための例で、実際に悩んだのは別のコードです。
 Pythonは何回か使い始めては放り出し、を繰り返して来ましたが、ここ1年くらいは落ち着いて使っています。ライブラリはすぐに見つかるし、手軽で使いやすい気はします。でもswitch文がないのは変な感じではあります……。