以下は、ネストされたループ(入れ子ループ)で break を使ったときに何が起きるかを、初心者向けに「完全テキスト図」で説明したものです。
読みやすさ重視で、
- 外側ループ:i
- 内側ループ:j
という構造で示します。
まずコード例(シンプルな break)
for i in range(1, 4): # i = 1,2,3
for j in range(1, 4): # j = 1,2,3
if j == 2:
break # ← 注目!
print(i, j)
Pythonbreak の大原則(ネスト時)
breakは 「当たっているループだけ」を完全に抜ける- 外側ループは 続く
continueと違って、そのループ自体を終了する
図で見れば分かりやすいです。
全体のイメージ(俯瞰図)
外側ループ(i)
└─ 内側ループ(j)
├─ j == 1 → 通常処理
├─ j == 2 → break(内側ループを完全終了 → jループを抜けて i の次へ)
└─ j == 3 → 実行されない(j=2 で内側が終了するため)
詳細な図解(ステップごと)
i = 1 のとき
i = 1
┌──────────────── 内側ループ(j) ───────────────────┐
│ j=1 → 条件(j==2?) false → print(1,1) │
│ j=2 → 条件(j==2?) true → break → 内側ループを完全終了 → 外側へ │
│ j=3 → (実行されない) │
└───────────────────────────────────────────┘
(結果: (1,1) だけ出力)
i = 2 のとき(再び内側ループが復活)
i = 2
┌─────────────── 内側ループ(j) ────────────────────┐
│ j=1 → print(2,1) │
│ j=2 → break → 内側ループを終了 → 外側へ │
│ j=3 → (実行されない) │
└───────────────────────────────────────────┘
i = 3 のとき
i = 3
┌─────────────────── 内側ループ(j) ────────────────┐
│ j=1 → print(3,1) │
│ j=2 → break │
│ j=3 → (実行されない) │ └───────────────────────────────────────────┘
break の作用範囲を強調した図(どこに効く?)
for i in ...:
for j in ...:
if j == 2:
break ← ★これが止めるのは「jループ」だけ
大きな図で示すと:
外側ループ(i)
┌──────────────────────────────────────────┐
│ 内側ループ(j) │
│ ┌─────────────────────────────────────┐ │
│ │ if j == 2: break ← ★ここだけ終了 │ │
│ └─────────────────────────────────────┘ │
│ ↑↑↑ 外側ループ(i)は続く │
└──────────────────────────────────────────┘
continue との決定的な違い(図で比較)
continue(その回だけ飛ばして同じループを継続)
j = 1 → OK
j = 2 → continue → j = 3
j = 3 → OK
break(そのループ自体を即終了)
j = 1 → OK
j = 2 → break → 内側ループ終了 → 次の i へ
j = 3 → 実行されない
まとめ(初心者向けに一言で)
continueは「飛ばすだけ」breakは「止める」- ネストされていても、止まるのは 「書かれているそのループだけ」
- 外側ループは普通に進む
