はじめに
Qiita初投稿の新米エンジニアです。
仕事でちょこちょこpythonを使うようになり、ある程度コーディングもしていたのですが、恥ずかしながらand
やor
の挙動について勘違いがあったのでまとめました。
どういうことか
こういうこと。
>>> 'foo' and ''
''
>>> 'foo' or ''
'foo'
>>> 'foo' and 'bar'
'bar'
>>> 'foo' or 'bar'
'foo'
and
やor
はboolを返すものだと思っていましたが、どうやらそうではない。
'foo' and ''
→ ''
'foo' or ''
→ 'foo'
あたりは何となくわかりますが、なぜ
'foo' and 'bar'
→ 'bar'
'foo' or 'bar'
→ 'foo'
のようにand
とor
で結果が異なるのか。
そのあたりの挙動について、ドキュメントのブール演算子の項を参考に以下にまとめました。
and
演算子、or
演算子の評価ロジック
x and y
もx or y
も、基本的には以下の評価を行い、結果を返す。
-
x
の真偽値によって式全体の真偽値が確定する場合(y
の真偽値に関わらず式全体の真偽値が確定する場合)はx
を返す。 -
x
の真偽値だけでは式全体の真偽が確定しない場合(y
の真偽値を見て初めて式全体の真偽値が確定する場合)はy
を返す。
※なお、not
演算子については、戻り値はいつでもboolとなります。
冒頭の4つの式についてそれぞれ上記のロジックに当てはめると、
-
'foo' and ''
→'foo'
は空文字でないので真。式全体の真偽が確定しないため''
を返す。 -
'foo' or ''
→'foo'
は空文字でないので真。式全体の真偽が確定するため'foo'
を返す -
'foo' and 'bar'
→'foo'
は空文字でないので真。式全体の真偽が確定しないため'bar'
を返す。 -
'foo' or 'bar'
→'foo'
は空文字でないので真。式全体の真偽が確定するため'foo'
を返す
つまり'foo' and 'bar'
と'foo' or 'bar'
で結果の異なる理由としては、'foo'
の評価の時点で結果が確定するか'bar'
の評価で確定するかの違い。
ちなみに
この挙動を利用して、以下のように文字列にデフォルト値を設定することができる
a = s or 'foo' # sがFalseなら'foo'を代入
挙動としては以下と同じです。
a = s if s else 'foo'