変数を複数同時に代入するときの挙動
処理順に注意しましょうという話
Pythonには代入を
code:a.py
a = 1
b = 2
の代わりに
code:a.py
a, b = 1, 2
とまとめて書く記法がある。
値・参照の交換:
code:a.py
a, b = b, a # print(a, b) -> 2 1
更新前の値で計算してから代入:
code:a.py
a, b = b, a + b # print(a, b) -> 2 3
といったこともできる。
しかし、配列の要素を更新するときはちょっと注意が必要になる
「nをL[n]で更新しながら、更新前のnでL[n]にmを入れていく」という操作を
code:ng.py
と書くと、更新後のnでL[n]にmを入れてしまう。
(ここからdisの出力を眺めての推測)
この1行の処理順は
右辺の値を左から順に計算してスタックに積む
ここの順番は時と場合による?
左辺は左から順に代入先を調べる→代入するを繰り返す
になっている。
これに従うと、ng.pyでは「nを更新」→「L[n]の場所を調べる」→「L[n]を更新」になってしまい、おかしくなる。
(推測ここまで)
今回の例では順番を入れ替えて
code:ok.py
とすることで、やりたい動作になってくれる。
(右辺を全部計算→左辺の場所を全部調べる→代入していく ならどっちでもいけたのに……と思いつつ、この処理順になってる理由もなにかありそうね)