PythonでNoneかどうかを判定する方法【必ずis演算子を使う】
Pythonで変数がNoneであるかどうかを判定する方法について解説します。
Noneの判定にはis演算子を使う(急いでいる人向け)
Pythonでは、変数がNone
であるかどうかはis
演算子を使ってNone
と比較することで判定します。None
ではないことを判定するには、is not
でNone
と比較します。
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
という比較をしても、x
がNone
の場合には問題なくTrue
が返されます。
しかし、None
の判定には必ずis
演算子を使うようにしましょう。その理由は、Pythonにおけるオブジェクトの同一性と同値性が関係しています。
簡単に説明すると、同一性とは二つのオブジェクトが全く同じであること、同値性とは二つのオブジェクトの値が同じであることを表します。少し込み入った話になるのですが、==
演算子や!=
演算子による同値性をチェックするメソッドはPythonのそれぞれのクラスに定義されています。要するに『どのような場合に同じ値とみなすかを、実装者が決める』ことになっています。そのため、実際にはNone
オブジェクトではないのに、None
オブジェクトと比較した時に同じ値であると評価される可能性があるのです。
一方で、is
演算子による同一性のチェックは、オブジェクトが全く同じもの(同じメモリ上のアドレス)であるかを判定します。Pythonにおいて、None
はシングルトン(プログラムの実行中に、ただ一つしか存在しないオブジェクト)なので、is
演算子による同一性のチェックをすると、比較したオブジェクトがNone
であるかどうかを確実に判定できます。
これが、None
の判定にはis
を使わなければいけない理由です。is
と==
による、同一性と同値性の判定の違いについては、以下の記事にまとめています。