PythonでNoneかどうかを判定する方法【必ずis演算子を使う】

Pythonで変数がNoneであるかどうかを判定する方法について解説します。

PythonでNoneかどうかを判定する方法【必ずis演算子を使う】

Noneの判定にはis演算子を使う(急いでいる人向け)

Pythonでは、変数がNoneであるかどうかはis演算子を使ってNoneと比較することで判定します。Noneではないことを判定するには、is notNoneと比較します。

x = None
y = "Sample string"

# 変数がNoneであるならTrue、NoneではないならFalse
print(x is None)
# True

print(y is None)
# False


# is notを使うことで、判定のBool型は逆になる
print(x is not None)
# False

print(y is not None)
# True

PythonのNoneとは?

NoneはPythonで『値がないこと』を表す特殊な値です。他のプログラミング言語の null に相当するものです。

Noneは、特別な型 NoneType の1つのオブジェクトであり、Noneを代入する変数は、実際には何も格納していません。特に、関数が値を返さない場合や、変数を初期化する場合などに使われます。ちなみに、Noneオブジェクトにはメソッドがありません。

x = None
print(x)
# None

print(type(x))
# <class 'NoneType'>

オブジェクトがNoneであるかを判定する方法(is演算子)

Pythonで特定のオブジェクトがNoneであるかを判定するにはis演算子を使います。記法は、オブジェクト is Noneで、Trueが返されればオブジェクトNoneであることがわかります。

逆に、オブジェクトがNoneではないことを確認するには、オブジェクト is not Noneという否定系を使います。Trueが返されれば、オブジェクトはNoneではありません。

# Noneの判定は、is演算子でNone自体と比較する
x = None
print(x is None)
# True
print(x is not None)
# False


# 空文字などはNoneと判定されない
x = ""
print(x is None)
# False
print(x is not None)
# True

どうしてNoneの判定には==ではなくisを使わなければいけないのか?

Noneの判定をする場合に、is演算子ではなく、==演算子を使っても、同じことができるように思えます。

実際に、x == Noneという比較をしても、xNoneの場合には問題なくTrueが返されます。

しかし、Noneの判定には必ずis演算子を使うようにしましょう。その理由は、Pythonにおけるオブジェクトの同一性と同値性が関係しています。

簡単に説明すると、同一性とは二つのオブジェクトが全く同じであること、同値性とは二つのオブジェクトの値が同じであることを表します。少し込み入った話になるのですが、==演算子や!=演算子による同値性をチェックするメソッドはPythonのそれぞれのクラスに定義されています。要するに『どのような場合に同じ値とみなすかを、実装者が決める』ことになっています。そのため、実際にはNoneオブジェクトではないのに、Noneオブジェクトと比較した時に同じ値であると評価される可能性があるのです。

一方で、is演算子による同一性のチェックは、オブジェクトが全く同じもの(同じメモリ上のアドレス)であるかを判定します。Pythonにおいて、Noneはシングルトン(プログラムの実行中に、ただ一つしか存在しないオブジェクト)なので、is演算子による同一性のチェックをすると、比較したオブジェクトがNoneであるかどうかを確実に判定できます。

これが、Noneの判定にはisを使わなければいけない理由です。is==による、同一性と同値性の判定の違いについては、以下の記事にまとめています。