質問: 基本的な質問にて失礼します。 以下のfor文ですが、1回目のループでnに入ったtaroが出力され、同様に2回めのループではjiro、3回めではsaburo、4回目ではshiroが出力されるのは直感的に、なにも違和感がありません。 ``` for n in ['taro','jiro','saburo','shiro']: print(n) taro jiro saburo shiro ``` しかし、たとえば、以下のようにHelloが4回出力されるケースについて、素直になれないのです。たしかに、inのリストの数が4つ、なのでhelloも4つなのですが..もう少し、突っ込んだ因果関係を知りたいと思ったりしています。どうぞ、よろしくお願いいたします。 ``` for n in ['taro','jiro','saburo','shiro']: print('Hello') hello hello hello hello ```
回答: 仕組み 仕組みについては残念ながらあなたの直感はどうでもいい話です。 事実は動かしようがないので、直感と事実が違うならあなたの直感の方を事実に寄せてください。 `for..in...`がどういうモノなのかはy_shinodaさんの回答にもありますこちらを参照します。 8. 複合文 (compound statement) — Python 3.8.4 ドキュメント これをものすごく簡単に要約すると ``` for n in ['taro','jiro','saburo','shiro']: 何か ``` は ``` n = 'taro' 何か n = 'jiro' 何か n = 'saburo' 何か n = 'shiro' 何か ``` と同じです。(`break`や`continue`とかあったら話は別ですが。) 「何か」(suite)の部分で、列挙したもの:`n`(target_list)を無視してはならないとはどこにも書いてませんし、 実際無視してもエラーにはならないので、質問文の`n`を使わないコードは合法です。 そう言語仕様が定まった理由 「なぜ列挙したものを無視してもいい言語仕様になっているか」についてはpythonを作った人に聞くしか無いので正確には言えませんが、 無視できなければ例えば「リストxsの個数だけ'hello'と表示する」という 「リストの中身はどうでもいいけど個数分だけ繰り返したい」場合に`for...in...`で書けなくなって困るな、ということはわかります。 他の言語を見てみると、変数を置いておきながら使わないと、「使ってないけど大丈夫?」と気を遣って警告を出してくれる言語はいくつかあります。 例えばswiftは「使わないならそうと分かるように変数名を`_`にしろ」と警告を出してきます。 ``` for i in 0..<10 { print("hello") } ``` ``` main.swift:2:5: warning: immutable value 'i' was never used; consider replacing with '_' or removing it for i in 0..<10 { ^ _ ```