Pythonの多重ループをbreakで抜ける方法|内側だけ・外側まで抜ける5つの書き方

Pythonの break が抜けるのは、いちばん内側の for / while ループ1つだけです。多重ループを外側までまとめて抜けたいときは、ループを関数に入れて return するのがいちばん読みやすく、ほかにフラグ変数、for-else、itertools.product で1重にする方法があります。

Pythonには、Javaの「ラベル付き break」のような、外側のループを名指しして抜ける構文はありません。この記事では、break の基本を確認したあと、多重ループを抜ける5つの書き方を同じ例題で比べます。コードはすべて Python 3.12.15 で実行し、Python 3.14 で変わった点は 3.14.8 で確認しました(2026年10月15日確認)。for文そのものの書き方は「Pythonのfor文の使い方」で説明しています。

break の基本:ループを途中で終える

break は、実行された時点でループを終え、ループの次の行へ進みます。

for i in range(5):
    if i == 3:
        break          # ループを終える
    print(i)
print("ループの後")

実行結果:

0
1
2
ループの後

if と組み合わせて「条件を満たしたら終わる」形で使うのが基本です。while でも同じように使えます。

多重ループの break は内側しか抜けない

Python公式チュートリアルは、break は「いちばん内側を囲んでいる for または while ループ」を抜けると説明しています(Python チュートリアル 4.4)。

for i in range(3):
    for j in range(3):
        if j == 1:
            break      # 抜けるのは内側の for だけ
        print(f"i={i}, j={j}")

実行結果:

i=0, j=0
i=1, j=0
i=2, j=0

j == 1 で break すると内側の for は終わりますが、外側の for はそのまま次の i に進みます。そのため i=0, 1, 2 のすべてで j=0 が表示されます。

外側も止めたい場合の書き方を、次の例題で比べます。「3×3 の表から 4 を探し、見つかったら探すのをやめて位置を表示する」という処理です。

多重ループを外側まで抜ける5つの方法

方法向いている場面注意点
1. 関数にして return探索して結果を返す処理。まず検討したい関数に切り出す必要がある
2. フラグ変数関数にしにくい短い処理break を2か所に書く。フラグの更新忘れに注意
3. for-elseフラグを使いたくないとき読み慣れていない人には意図が伝わりにくい
4. itertools.product単純な二重・三重の range ループ外側ごとの処理を挟めない
5. 例外深い入れ子から一気に出たい特殊な場合エラーではない流れに例外を使うので乱用しない

方法1:関数にして return で抜ける(おすすめ)

return は関数そのものを終えるので、何重のループの中からでも一度に抜けられます。

grid = [
    [3, 8, 1],
    [9, 4, 7],
    [2, 6, 5],
]
target = 4


def find(grid, target):
    for r, row in enumerate(grid):
        for c, value in enumerate(row):
            if value == target:
                return r, c        # return で両方のループを一度に抜ける
    return None


print(find(grid, target))
print(find(grid, 10))

実行結果:

(1, 1)
None

見つからなかったときの戻り値(ここでは None)も決められるので、呼び出し側で結果を判定しやすくなります。「探す」という処理に名前が付くので、読む人にも意図が伝わります。

方法2:フラグ変数で外側も break する

見つかったかどうかを変数に入れておき、内側を抜けた直後に外側でも break します。どこまで調べたかがわかるよう、調べた値を表示しています。

grid = [
    [3, 8, 1],
    [9, 4, 7],
    [2, 6, 5],
]
target = 4

found = None
for r, row in enumerate(grid):
    for c, value in enumerate(row):
        print("調べた:", value)
        if value == target:
            found = (r, c)
            break              # 内側を抜ける
    if found is not None:
        break                  # 外側も抜ける

print("位置:", found)

実行結果:

調べた: 3
調べた: 8
調べた: 1
調べた: 9
調べた: 4
位置: (1, 1)

4 を見つけたところで止まり、残りの 7, 2, 6, 5 は調べていません。外側の if found is not None: break を書き忘れると、内側だけ抜けて次の行の探索が続いてしまうので注意します。

方法3:for-else を使う

for や while には else を付けられ、ループが break されずに最後まで回ったときだけ else の中が実行されます(Python チュートリアル 4.5)。これを使うとフラグなしで書けます。

grid = [
    [3, 8, 1],
    [9, 4, 7],
    [2, 6, 5],
]
target = 4

for r, row in enumerate(grid):
    for c, value in enumerate(row):
        if value == target:
            break              # 内側を break で抜けた
    else:
        continue               # 内側が最後まで回った(見つからなかった)ら次の行へ
    break                      # 内側で break したときだけここに来る

print("位置:", (r, c))

実行結果:

位置: (1, 1)

流れは次のとおりです。

  • 内側で break しなかった(その行に 4 がなかった)→ else の continue が実行され、外側は次の行へ
  • 内側で break した(4 が見つかった)→ else は飛ばされ、その下の break で外側も終わる

短く書けますが、「else = ループが最後まで回ったとき」という決まりを知らないと読めません。チームで使うなら、コメントを添えるか方法1・2を選ぶのが無難です。

方法4:itertools.product でループを1つにする

二重の range ループは、itertools.product で「組み合わせを順に取り出す1重のループ」に書き換えられます(Python公式ドキュメント itertools.product)。ループが1つなら break も1回で済みます。

from itertools import product

grid = [
    [3, 8, 1],
    [9, 4, 7],
    [2, 6, 5],
]
target = 4

for r, c in product(range(len(grid)), range(len(grid[0]))):
    if grid[r] == target:
        print("位置:", (r, c))
        break                  # ループが1つなので break 1回で済む
else:
    print("見つかりませんでした")

実行結果:

位置: (1, 1)

ここでは for-else を「見つからなかったとき」の表示に使っています。ただし、外側のループごとに何か処理をしたい(行ごとに小計を出すなど)場合は、この形にはできません。

方法5:例外で抜ける

自分で例外クラスを作り、raise で一気に外へ出る方法もあります。

class Found(Exception):
    pass


grid = [
    [3, 8, 1],
    [9, 4, 7],
    [2, 6, 5],
]

try:
    for r, row in enumerate(grid):
        for c, value in enumerate(row):
            if value == 4:
                raise Found    # 例外で一気に外へ出る
except Found:
    print("位置:", (r, c))

実行結果:

位置: (1, 1)

動きはしますが、例外は本来エラーを知らせるための仕組みです。ふつうの探索なら方法1で足ります。何重にも入れ子になっていて関数に分けにくい場合などに限って使います。

Pythonに「ラベル付き break」はない

Java や JavaScript では、外側のループに名前(ラベル)を付けて break outer; のように書けます。Pythonにも同じ機能を入れる提案(PEP 3136「Labeled break and continue」、2007年)がありましたが、却下されています(PEP 3136)。「break outer」で検索しても、Pythonではこの書き方は使えません。上の5つの方法のどれかで書きます。

while ループと break

while でも break の働きは同じです。while True: の無限ループは、break で止めるのが定番の書き方です。while の中に for があるときも、break が抜けるのは内側の1つだけです。

count = 0
while True:
    count += 1
    if count > 3:
        break                  # while True は break で止める
    for n in range(10):
        if n == 2:
            break              # この break は for だけを抜ける
        print(f"count={count}, n={n}")
print("終了 count =", count)

実行結果:

count=1, n=0
count=1, n=1
count=2, n=0
count=2, n=1
count=3, n=0
count=3, n=1
終了 count = 4

for の中の break(n == 2)では while は終わらず、count が 4 になったところで while の break が実行されて終わっています。

continue との違い

break がループを終えるのに対し、continue はその回の残りを飛ばして次の回へ進みます。continue も、効くのはいちばん内側のループだけです。

for i in range(3):
    for j in range(3):
        if j == 1:
            continue           # j == 1 だけ飛ばして次の j へ
        print(f"i={i}, j={j}")

実行結果:

i=0, j=0
i=0, j=2
i=1, j=0
i=1, j=2
i=2, j=0
i=2, j=2

continue の使い方は「continue文の使い方」でも解説しています。

Python 3.14 の変更:finally の中の break は警告が出る

Python 3.14 から、try 文の finally ブロックの中から break・continue・return で抜けるコードに SyntaxWarning が出るようになりました(PEP 765)。finally の中で break すると、try の中で起きた例外が消えてしまうことがあるためです。

for i in range(3):
    try:
        print("処理", i)
    finally:
        if i == 1:
            break

Python 3.14.8 での実行結果:

b10.py:6: SyntaxWarning: 'break' in a 'finally' block
  break
処理 0
処理 1

Python 3.12.15 では警告は出ず、「処理 0」「処理 1」だけが表示されました。警告なので動作は変わりませんが、ループを止める判定は finally の外に書きます。

よくある間違い

  • break を if の外に書いてしまう:インデントがずれて、1回目で必ずループが終わる
  • フラグを立てたのに外側で break していない:内側だけ抜けて、外側の探索が続く
  • 関数の外で return を書く:SyntaxError: 'return' outside function になる。方法1は関数の中で使う
  • ループの外で break を書く:SyntaxError: 'break' outside loop になる

よくある質問

Q. Pythonで二重ループを一度に抜けるにはどうすればいいですか?

ループを関数に入れて return するのがいちばん簡単です。関数にしにくい場合は、フラグ変数を使って内側と外側の両方で break するか、for-else を使います。

Q. break はどのループを抜けますか?

break を囲んでいるループのうち、いちばん内側の for または while ループ1つだけを抜けます。外側のループはそのまま続きます。

Q. Pythonに break outer のようなラベル付き break はありますか?

ありません。ラベル付き break を追加する提案(PEP 3136)は却下されています。関数と return、フラグ変数、for-else などで書きます。

Q. for-else の else はいつ実行されますか?

ループが break されずに最後まで回り終わったときに実行されます。break でループを抜けたときは実行されません。

まとめ

  • break が抜けるのは、いちばん内側のループ1つだけ
  • 多重ループをまとめて抜けるなら、まず「関数にして return」を考える
  • 関数にしにくければフラグ変数か for-else。単純な range の二重ループなら itertools.product で1重にできる
  • Pythonにラベル付き break はない(PEP 3136 は却下)
  • Python 3.14 からは finally の中の break に SyntaxWarning が出る

あわせて読みたい

学習の順序はPython学習のロードマップ、標準で使える機能の一覧はPython標準ライブラリのモジュール一覧にまとめています。

Pythonの関数・メソッドの全体像はPython基本関数・メソッド完全一覧にまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら