初心者の開発者は条件文でこのようなコードをよく見ます:

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「まだ値がない」 という意味を持つ 特別なオブジェクト で、
  • ""文字列ですが空です

Empty vs None speech bubble comparison

上の画像を見ると、 左側の男性は吹き出しを持っていますが何も言っていません — これは空文字列 "" に該当します。
右側の女性は吹き出しすらありません — これは None です。

これら2つは以下の条件で False と評価されます:

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("両方とも無言です!")  # 両方ともFalseなので実行されます

じゃあ実際にどう区別すればよいのか?

例えば、ユーザー入力を処理する場合を見てみましょう:

username = user_input.get("username", None)
  1. ユーザーが入力しなかった場合 → None
  2. ユーザーが空文字列を入力した場合 → ""

これを異なる方法で処理したい場合は?

if username is None:
    print("入力がありません!")
elif username == "":
    print("空文字列が入力されました。")
else:
    print("入力された値:", username)

実務でよくある間違い

次のコードは時々意図せずすべての Falsy 値をフィルタリングします:

if not username:
    print("入力がありません")

しかしこの条件は 空文字列だけでなく None0、空リストなども含まれます
したがって、意図を明確にする必要があります:

  • 空値でも文字列なら許可するべきif username is None:
  • 文字列が空ですが存在する必要があるif username != "":
  • ただ何の値も持たない必要があるif not username:

まとめ

None""は同じではありません。しかし両方とも False のように動作します。
この違いを理解して使えば、あなたのコードの意図が より明確でバグのない方向 に進むことができます。

次の投稿では 0[]{} などの他の Falsy 値と is== の違いについてもっと詳しく見ていきます!