代入文 は、名前を値に (再) 束縛したり、 変更可能なオブジェクトの属性や要素を変更したりするために使われます:
assignment_stmt | ::= | (target_list "=")+ expression_list |
target_list | ::= | target ("," target)* [","] |
target | ::= | identifier |
| "(" target_list ")" | ||
| "[" target_list "]" | ||
| attributeref | ||
| subscription | ||
| slicing |
(末尾の三つのシンボルの構文については 5.3 節を 参照してください。)
代入文は式のリスト (これは単一の式でも、 カンマで区切られた式リストでもよく、後者はタプルになることを 思い出してください) を評価し、得られた単一の結果オブジェクトを ターゲット (target) のリストに対して左から右へと代入してゆきます。
代入はターゲット (リスト) の形式に従って再帰的に行われます。 ターゲットが変更可能なオブジェクト (属性参照、添字表記、またはスライス) の一部である場合、この変更可能なオブジェクトは最終的に代入を 実行して、その代入が有効な操作であるか判断しなければなりません。 代入が不可能な場合には例外を発行することもできます。型ごとに みられる規則や、送出される例外は、そのオブジェクト型定義 で与えられています ( 3.2 節を参照してください).
ターゲットリストへのオブジェクトの代入は、以下のようにして再帰的に 定義されています。
単一のターゲットへの単一のオブジェクトの代入は、以下のようにして 再帰的に定義されています。
名前がすでに束縛済みの場合、再束縛 (rebind) がおこなわれます。 再束縛によって、以前その名前に束縛されていたオブジェクトの 参照カウント (reference count) がゼロになった場合、オブジェクトは 解放 (deallocate) され、デストラクタ (destructor) が (存在すれば) 呼び出されます。
一次語が変更可能な (リストのような) シーケンスオブジェクトの場合、 まず添字は整数でなければなりません。添字が負数の場合、シーケンスの 長さが加算されます。添字は最終的に、シーケンスの長さよりも小さな 非負の整数でなくてはなりません。次に、添字をインデクスに 持つ要素に非代入オブジェクトを代入してよいか、シーケンスに問い合わせ ます。範囲を超えたインデクスに対してはIndexError が送出されます (添字指定されたシーケンスに代入を行っても、 リスト要素の新たな追加はできません)。
一次語が (辞書のような) マップオブジェクトの場合、まず添字は マップのキー型と互換性のある型でなくてはなりません。 次に、添字を被代入オブジェクトに関連付けるようなキー/データ の対を生成するようマップオブジェクトに問い合わせます。 この操作では、既存のキー/値の対を同じキーと別の値で置き換えても よく、(同じ値を持つキーが存在しない場合) 新たなキー/値の対を挿入しても かまいません。
(現在の実装では、ターゲットの構文は式の構文と同じであるとみなされて おり、無効な構文はコード生成フェーズ中に詳細なエラーメッセージを 伴って拒否されます。)
警告: 代入の定義では、左辺値と右辺値がオーバラップするような代入 (例えば、"a, b = b, a" を行うと、二つの変数を入れ替えます) を 定義しても `安全 (safe)' に代入できますが、代入対象となる 変数群 の間で オーバラップがある場合は安全ではありません! 例えば、以下のプログラムは "[0, 2]" を出力してしまいます:
x = [0, 1] i = 0 i, x[i] = 1, 2 print x