3秒でわかる
Python で値が存在しないことだけを表す専用の値。未設定を 0 や空文字と区別するために使い、判定は is で行います。
もう少し詳しく
どういうものか
None は Python で「値が無い」ことだけを表す特別な値になる。0 でも空文字でも False でもなく、NoneType 型の唯一の値として存在する。値を返さない関数は暗黙のうちに None を返し、辞書の get で見つからなかったときにも None が返る。他の言語の null や nil と役割が近い。
なぜ必要か
「まだ入力されていない」と「0 と入力された」は区別しなければならない。体重の初期値を 0 にすると、未入力の人が体重 0 と記録されて平均が狂う。None を入れておけば、値そのものと未設定の状態を別物として扱える。関数が結果を返せなかったことを、例外を投げずに伝える手段としても使われる。
具体例
def find_user(users, name):
for u in users:
if u["name"] == name:
return u
return None # 見つからなかった
user = find_user(users, "sato")
if user is None:
print("該当なし")
else:
print(user["age"])つまずきやすいところ
判定を == で書くのが最初の落とし穴になる。None は常に一つしか存在しないため、同一かどうかを見る is None を使う。== はクラス側で定義を変えられるので、独自クラスが相手だと意図しない結果になりうる。
もう一つ多いのが AttributeError で、None に対してメソッドを呼んだときに出る。'NoneType' object has no attribute というメッセージが出たら、値の中身ではなく「その変数へ None が入った経路」を探す。list.sort() や list.append() は None を返すので、x = lst.sort() と書くと x が None になる、という取り違えもここに含まれる。
似た用語との違い
| 値 | 意味 | 真偽値として |
|---|---|---|
| None | 値が存在しない | 偽 |
| 0 | 数値としてのゼロ | 偽 |
| "" | 空の文字列 | 偽 |
| False | 論理値の偽 | 偽 |
すべて偽として扱われるため、if not x では四つを区別できない。未設定だけを見分けたいときは if x is None と書く。
覚え方
None は「箱が空」ではなく「箱がまだ置かれていない」状態にあたる。空の箱 (空文字や空リスト) と、箱そのものが無い状態は別物になる。この区別を保つと、集計から未入力を除く処理が素直に書ける。