はてブロ@ama_ch

https://twitter.com/ama_ch

初めてのPythonでよくわからないとこ

p.265に載っている以下のソース

>>> t, f = 1, 0
>>> x, y = 88, 99
>>> a = (t and x) or y
>>> a
88
>>> a = (f and x) or y
>>> a
99

ふむふむ。
これに以下の説明が続きます。

これで一応、問題はないのですが、このコードは「xが決してfalseになることはない」という保証がなければ使えません(xがfalseの場合、この式は常にyを返す)。よりifステートメントに近付けるには、戻り値にしたいオペランドを[]に入れ、決してfalseにならないようにする必要があります。

この説明がよくわからない。xがfalseだと何がマズイんだろう?yが返ってくるだけじゃないのか。
そして[]に入れたものが以下。

>>> ((t and [x]) or [y])[0]
88
>>> ((f and [x]) or [y])[0]
99
>>> (t and f) or y
99
>>> ((t and [f]) or [y])[0]
0

んん〜〜こんな書き方する意味は?試しにx = Falseと代入して比較してみた。

>>> x = False
>>> ((t and [x]) or [y])[0]
False
>>> (t and x) or y
99
>>> ((f and [x]) or [y])[0]
99 
>>> (f and x) or y
99

あああ、わかった!

よりifステートメントに近付けるには

という前提を忘れてた。
ifステートメントで書くと

>>> if t: x
... else: y
... 
False

こうなるもんね。この結果と等しくなるのは((t and [x]) or [y])[0]の方か。
ifステートメントで表した場合「もしtが真ならxを実行しなさい」という意味を持つから、実行するxがfalseだと条件として扱われてしまうと。