if
文に変数を渡したときの挙動というのは言語ごとにまちまちでなかなか間違えやすいところです。
今回は Python で if
文に変数を渡したときにどういう評価になるのかというところをデータ型別に見てみたいと思います。
以下、次の組み込み型について順番に見ていきます。
- 数値型
- 文字列型
- リスト・タプル・辞書・集合型
- 論理値型
None
数値型
数値型の場合は 0 なら False
で、それ以外ならすべて True
になります。
a = 1
b = 0
if a:
print 'True' # True
if b:
print 'True' # 何も表示されない
文字列型
文字列型の場合は、空文字列なら False
、空文字以外ならすべて True
、となります。
a = 'Hello'
b = ''
if a:
print 'True' # True
if b:
print 'True' # 何も表示されない
リスト・タプル・辞書・集合型
いずれも、空(空集合)なら False
、それ以外なら 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
」としても同じように動きますが、どちらかといえば「 a is None
」の方がよいようです。理由は、 1) クラスの定義によっては == None
ではつかまえられないレアケースがあるから、 2) is None
の方が実行速度が速いから、の 2 点だそうです。 そのあたりについて書かれたブログ記事 がありますので、詳細が気になる方はそちらをご覧になってみてください。