Arantium Maestum

プログラミング、囲碁、読書の話題

Python代入の流れーナンダコレ

stackoverflow.com

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

の方がより正確かとも思ったのだが、alist1[random.randrange(n)]を含んでいたりとかだった場合は必ずしもその限りではなくなる。結局dを評価した結果のオブジェクトをaからcまで順次代入していく、というのが正しい。最も右をまず評価してから、代入は左から右へ、というのが少し意外な流れ。

しかしまあこのようなコードを実際には書かないし、なるべくなら興味深いスニペットとして以外では読まないで済ましたいものだ。