LoginSignup
22
19

More than 3 years have passed since last update.

【Python】and演算子、or演算子はboolではなく評価したオブジェクト自身を返している

Last updated at Posted at 2018-03-03

はじめに

Qiita初投稿の新米エンジニアです。
仕事でちょこちょこpythonを使うようになり、ある程度コーディングもしていたのですが、恥ずかしながらandorの挙動について勘違いがあったのでまとめました。

どういうことか

こういうこと。

>>> 'foo' and ''
''
>>> 'foo' or ''
'foo'
>>> 'foo' and 'bar'
'bar'
>>> 'foo' or 'bar'
'foo'

andorはboolを返すものだと思っていましたが、どうやらそうではない。

'foo' and '' → '' 
'foo' or '' → 'foo' 
あたりは何となくわかりますが、なぜ
'foo' and 'bar' → 'bar'
'foo' or 'bar' → 'foo'
のようにandorで結果が異なるのか。

そのあたりの挙動について、ドキュメントのブール演算子の項を参考に以下にまとめました。

and演算子、or演算子の評価ロジック

x and yx 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'
22
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
19