pythonの論理式が真偽値以外も返す話

論理式が真偽値以外の結果を返却してくる不思議な構文のお話です。

何が入っているでしょう?

早速ですが、次のプログラムを実行したときvalueには何が入っているでしょう?

value = False or True

正解

正解はTrueです。

何が入っているでしょう?(2)

先ほどのは簡単だと思いますが、次はどうでしょう?

value = 0 or 1

ヒント

Pythonで数値は、0False1Trueとして評価されます。

正解

正解は、1です。

Trueが入ると思った方もいるとは思いますが、Pythonではandorの式は真偽値ではなく、真偽値として評価したときに条件を満たす値を返すという仕様になっているらしいのです。

流れとしては、上の式ではまず0が評価されます。
0Falseとして評価されるので次の値が評価されます。
0の次は1が評価されます。
1Trueとして評価されるので、1aに代入されます。

では、andの場合はどうなるでしょうか?

value = 0 and 1

# 0

ちょうどorの逆の挙動です。

value = 0 or 2 and 3

こんな具合に複数 連ねることもできます。

この場合valueに入っているのは3です。

短絡評価(ショートサーキット)

Pythonでandorを使うときに注意が必要なのは短絡評価(ショートサーキット)が行われることです。

ここでいう短絡評価というのは、左から順に値を確認していき、条件を満たさないことが確定したらそれより先の条件を評価しない、ということです。

具体的に、引数をprintしてreturnするだけの関数、print_and_returnを使って確認してみます。

def print_and_return(value):
    print(value)
    return value

a = print_and_return(True) or print_and_return(False) or print_and_return(True)

# True

実行してみると、表示されるのがTrueが一回だけなのがわかると思います。

この場合、一番最初にprint_and_returnを実行した段階でor式全体の結果がTrueなのが確定するので、それより先の式が評価されず、結果Trueが一回だけ表示されたということです。

上の例ではprintするだけでしたが、数値計算が絡むようなプログラムを、このことを知らずに組むと、思わぬところでバグを生み出すことになるので気をつけましょう。

まとめ

  • Pythonの条件式は真偽値を返すとは限らない
  • 短絡評価には気をつけよう