Python代入の流れーナンダコレ
a, b = a[b] = {}, 5
Raymond Hettingerの過去ツイートを追っていたら、これってどうなるんだ?とわからなかった式があった。
結果はa = {5:(a, 5)}、b=5と再帰的なディクショナリーができる。
肝は代入式の評価順で、a = b = c = dの場合、まず代入する値のdが評価された後、左から右へと代入が進んで行く。
つまりa=b=c=dは実際に実行される場合
a = d b = d c = d
にほぼ近しいわけだが、dが評価されるのは一回だけとなる。
元のスニペットの場合、
a, b = {}, 5
a[b] = a, b
になるわけで、こう書いてあれば非常にわかりやすい。
だったら一般例として
a = d b = a c = b
の方がより正確かとも思ったのだが、aがlist1[random.randrange(n)]を含んでいたりとかだった場合は必ずしもその限りではなくなる。結局dを評価した結果のオブジェクトをaからcまで順次代入していく、というのが正しい。最も右をまず評価してから、代入は左から右へ、というのが少し意外な流れ。
しかしまあこのようなコードを実際には書かないし、なるべくなら興味深いスニペットとして以外では読まないで済ましたいものだ。