7.3 for

for 文は、シーケンス (文字列、タプルまたはリスト) や、その他の 反復可能なオブジェクト (iterable object) 内の要素に渡って反復処理を 行うために使われます:

for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
Download entire grammar as text.

式リストは一度だけ評価されます; 結果はイテレーション可能オブジェクト にならねばなりません。expression_list の結果に対してイテレータ を生成し、その後、シーケンスの各要素についてインデクスの小さい順に 一度だけスイートを実行します。 このときシーケンス内の要素が通常の代入規則を使ってターゲットリスト に代入され、その後スイートが実行されます。全ての要素を使い切ると (シーケンスが空の場合にはすぐに)、 else 節があればそれが 実行され、ループを終了します。

最初のスイート内で break 文が実行されると、else 節の スイートを実行することなくループを終了します。 continue 文が最初のスイート内で実行されると、 スイート内にある残りの文の実行をスキップして、式の真偽評価に戻ります。

スイートの中では、ターゲットリスト内の変数に代入を行えます; この代入によって、次に代入される要素に影響を及ぼすことはありません。

ループが終了してもターゲットリストは削除されませんが、シーケンスが 空の場合には、ループでの代入は全く行われません。 ヒント: 組み込み関数 range() は、 Pascal 言語における for i := a to b do の効果を エミュレートするのに適した数列を返します; すなわち、 range(3) はリスト [0, 1, 2] を返します。

警告: ループ中のシーケンスの変更には微妙な問題があります (これは 変更可能なシーケンス、すなわちリストで起こります)。 どの要素が次に使われるかを追跡するために、内部的なカウンタが 使われており、このカウンタは反復処理を行うごとに加算されます。 このカウンタがシーケンスの長さに達すると、ループは終了します。 このことは、スイート中でシーケンスから現在の (または以前の) 要素を 除去すると、(次の要素のインデクスは、すでに取り扱った要素の インデクスになるために) 次の要素が飛ばされることを意味します。 同様に、スイート中でシーケンス中の現在の要素以前に要素を挿入すると、 ループ中で現在の要素が再度扱われることになります。 こうした仕様は、厄介なバグになります。シーケンス全体に相当するスライスを 使って一時的なコピーを作ると、これを避けることができます。

for x in a[:]:
    if x < 0: a.remove(x)

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。