静かなる名辞

pythonとプログラミングのこと


【python】三項演算子のネストには注意

 三項演算子(条件演算子)はpythonの文法でもっとも特徴的な要素かもしれません。

Trueのとき if 条件 else Falseのとき

 これには賛否両論がありますが、とにかく便利なことには違いありません。

 ただし、ネストして使うときは注意が必要です。

A if condition1 else B if condition2 else C

 こういうものを書いた場合、二通りに解釈できますね。

((A if condition1 else B) if condition2 else C)
(A if condition1 else (B if condition2 else C))

 実行してみるとわかりますが、下の解釈になります。

>>> "A" if True else "B" if False else "C"
'A'
>>> "A" if False else "B" if False else "C"
'C'

 if condition1 elseの三項演算子を先に認識し、 condition2の方はそのelse項(と言うしかない)とみなしている訳です。まあ、これは自然な仕様でしょう。

 ではかっこを付けたときの評価の順番を考えてみましょう。条件演算子では、まず条件が評価されます。それからTrueの場合か、Falseのときのどちらかが評価されます。

 なので、かっこで囲った方の優先順位が下がる(後に評価される)ような挙動になります。「かっこでくくると優先順位が上がる(先に評価される)」と捉えていると混乱します。思い通り動かすためにはかっこで囲う必要がある場合がほとんどなのに、それすら思い通り動かないというひどい状態に陥ります。

 コツは構文木とか決定木を書くつもりでグルーピングしていくことです。そうすると一応思い通り書けるようになります。

 注意が必要だね、という話でした。そもそもそういう事態(三項演算子の多重ネスト)を避けた方が聡明といえば、それまでかもしれませんが、必要に迫られて書くときは注意してください。