魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

低知能シリーズ

低知能なので if 文で引っかかりました。

サンプル用にこんなリストを用意します。

>>> my_list = [1, 2, 3]

まぁ当然の挙動です。

>>> 1 in my_list
True
>>> 4 in my_list
False

どちらかがリストに含まれていたらOK、みたいな処理が書きたい。

>>> if 1 in my_list or 4 in my_list:
...     print('hoge')
... 
hoge

でも in my_list が二つもあるので略せないかなと思う訳です。なのでまずは安直に in my_list を一つ省きます。

>>> if 1 or 4 in my_list:
...     print('hoge')
... 
hoge

お、イケんじゃね?

>>> if 4 or 5 in my_list:
...     print('hoge')
... 
hoge

ダメです。 なぜかというと、

>>> 1 or 4 in my_list
1

こういうことです。「1が真もしくは4が my_list に含まれる」と解釈され、Python では 0 以外の数字はそれ単体で True なので先ほどの書き方だと何を書いても真になってしまいます。

自分が意図していない順番で評価されてしまっているならこれでどうだ、という感じでカッコで括ってみます。

>>> if (1 or 4) in my_list:
...     print('hoge')
... 
hoge
>>> if (4 or 5) in my_list:
...     print('hoge')
... 

イケるのでは?

>>> if (4 or 1) in my_list:
...     print('hoge')
... 

ダメです。

>>> 4 or 5
4
>>> 4 or 1
4

こういうことですね。 ここで書いたやつでは4が既に True なのでこれがカッコの中が評価された結果となり、この4が my_list に含まれるか否か、という if 文になってしまっているわけです。

なので多少冗長に見えてもちゃんと書きましょうねというお話でした。 ちなみに後半のカッコで括ったバージョンはまだボツになった版のブランチにしっかり会社の GitHubリポジトリにプッシュしたままであることを書きながら思い出しました。 他の箇所の処理で既にボツなのでお蔵入り確定なのですが恥ずかしいので明日朝一で直しておこう…