初心者の開発者は条件文でこのようなコードをよく見ます:
if value:
print("値があります!")
最初はこのようなシンプルな if value:
文が 何をチェックしているのか 混乱しやすいです。
特に以下の2つ:
None
""
(空文字列)
これら2つはともに False
とみなされるため、まるで 同じように感じることがあります。
しかし、本当にそうでしょうか?
Falsyな値たち
Pythonでは、以下の値が条件文でFalseと評価されます:
None
False
0
,0.0
""
(空文字列)[]
(空リスト){}
(空辞書)set()
,()
などの空のコレクション
つまり、if not value:
はこれらすべてを一度にキャッチする方法です。
None
と""
は異なります
これらは見た目が異なり、異なる動作をします。
value1 = None
value2 = ""
print(value1 == value2) # False
print(value1 is value2) # False
print(bool(value1)) # False
print(bool(value2)) # False
==
は値の比較であり、is
は 同一性(id) の比較です。None
は 「まだ値がない」 という意味を持つ 特別なオブジェクト で、""
は 文字列ですが空です。
上の画像を見ると、 左側の男性は吹き出しを持っていますが何も言っていません — これは空文字列 ""
に該当します。
右側の女性は吹き出しすらありません — これは None
です。
これら2つは以下の条件で False
と評価されます:
male_voice = ""
female_voice = None
if not male_voice and not female_voice:
print("両方とも無言です!") # 両方ともFalseなので実行されます
じゃあ実際にどう区別すればよいのか?
例えば、ユーザー入力を処理する場合を見てみましょう:
username = user_input.get("username", None)
- ユーザーが入力しなかった場合 →
None
- ユーザーが空文字列を入力した場合 →
""
これを異なる方法で処理したい場合は?
if username is None:
print("入力がありません!")
elif username == "":
print("空文字列が入力されました。")
else:
print("入力された値:", username)
実務でよくある間違い
次のコードは時々意図せずすべての Falsy 値をフィルタリングします:
if not username:
print("入力がありません")
しかしこの条件は 空文字列だけでなく None
、 0
、空リストなども含まれます。
したがって、意図を明確にする必要があります:
- 空値でも文字列なら許可するべき →
if username is None:
- 文字列が空ですが存在する必要がある →
if username != "":
- ただ何の値も持たない必要がある →
if not username:
まとめ
None
と""
は同じではありません。しかし両方とも False
のように動作します。
この違いを理解して使えば、あなたのコードの意図が より明確でバグのない方向 に進むことができます。
次の投稿では 0
、[]
、{}
などの他の Falsy 値と is
と ==
の違いについてもっと詳しく見ていきます!
Add a New Comment