2013/02/09

Python で if 文に変数を入れたときの結果

if 文に変数を渡したときの挙動というのは言語ごとにまちまちでなかなか間違えやすいところです。

今回は Python で if 文に変数を渡したときにどういう評価になるのかというところをデータ型別に見てみたいと思います。

以下、次の組み込み型について順番に見ていきます。

  • 数値型
  • 文字列型
  • リスト・タプル・辞書・集合型
  • 論理値型
  • None


数値型

数値型の場合は、0ならFalseで、それ以外ならすべてTrue、となります。

a = 1
b = 0

if a:
    print 'True'  # True

if b:
    print 'True'  # 何も表示されない

ここに挙げたint型だけでなく、float型や虚数型の場合なんかでも「0ならFalse」というのは共通しています。

文字列型


文字列型の場合は、空文字列ならFalse、空文字以外ならすべてTrue、となります。

a = 'Hello'
b = ''

if a:
    print 'True'  # True

if b:
    print 'True'  # 何も表示されない

リスト・タプル・辞書・集合型


いずれも、空(空集合)ならFalse、それ以外ならTrue、となります。リストの場合などには、要素がすべて0でもTrueとなります。

a = [1, 2, 3]
b = []

if a:
    print 'True'  # True

if b:
    print 'True'  # 何も表示されない

a = {'car': 1, 'house': 2}
b = {}

if a:
    print 'True'  # True

if b:
    print 'True'  # 何も表示されない

論理値型


論理値型はもちろんそのままで、TrueならTrue、FalseならFalseとなります。

None


Noneの場合はFalseとなります。

a = None

if a:
    print 'True'  # 何も表示されない

強いてNoneかFalseかどちらなのかを区別したい場合は「is」を使って

if a is None:
    print '%s is None' % a  # None is None

とするとよいようです。

この「 a is None 」というのは「 a == None 」としても同じように動きますが、どちらかといえば「 is None 」の方がよいようです。理由は、1)クラスの定義によっては「 == None 」ではつかまえられないレアケースがあるから、2)「 is None 」の方が実行速度が速いから、の2点だそうです。そのあたりについて書かれたブログ記事がありますので、詳細がきになる方はそちらをご覧になってみてください。

0 件のコメント: