
Table of Contents(目次)
Noneとは何か
Noneは『値が存在しないこと』を表す特別なオブジェクトです。Pythonには型という考え方がありますが、Noneの型はNoneTypeです。Noneは、プログラムの実行中に必ず1つしか存在しない、という特徴があります。つまり、どんなに多くの変数に代入しても、すべて同じ1つのNoneを指しているのです。専門用語では『シングルトン』(同一オブジェクトが1つだけ存在する設計)と呼びますが、要するに『唯一無二の存在』だと理解すれば十分です。
次のコードは、Noneがプログラムの実行中に1つしか存在しないことを示すサンプルです。これまで学習してきた、基本的な変数の代入の他に、関数やクラスの中で代入されたNoneについても値やidを確認します。いずれの場合も同じidを参照していることが確認できれば大丈夫です。(コメントにあるidは、実行環境によって異なります。)
(※関数やクラスについては、専用のレクチャーで学習します。)
# Noneがプログラム中に1つしか存在しないことを示すサンプル
# 関数、classなどの処理の中で代入されたNoneも、全て同じ値・idを参照している
def check_local_none():
local_none = None
print(local_none is None) # True
print(id(local_none)) # NoneのID (140709436572144) # idは実行環境により異なる
return local_none # 関数の中で代入されたNoneを返す
def return_none():
return # returnを使って、Noneを返す
class Sample:
def get_none(self):
pass # returnを使わずに終了した時に返されるNone
# グローバル空間でのNone
global_none1 = None
global_none2 = None
print(global_none1 is global_none2) # True(同じオブジェクトを指している)
print(id(global_none1)) # 140709436572144 (オブジェクトIDも同じ)
print(id(global_none2)) # 140709436572144
none_from_func1 = check_local_none()
none_from_func2 = return_none()
none_from_class = Sample().get_none()
print(none_from_func1 is None) # True
print(none_from_func2 is None) # True
print(none_from_class is None) # True
print(id(none_from_func1)) # NoneのID (140709436572144)
print(id(none_from_func2)) # NoneのID (140709436572144)
print(id(none_from_class)) # NoneのID (140709436572144)
デフォルト値としてのNoneの使い方
None
が実際にどんな場面で使われるのかというと、よくあるのは、変数やデータ構造の要素の値がまだ決まっていないことを示すために使うケースです。
# 初期設定
score = None
print(score) # None
# 得点が決定したら、値を代入する
score = 80
print(score) # 80
d = {}
d.setdefault('key')
print(d) # {'key': None} (まだ"value"の値が設定されていないため、値が設定されていないことを明示的にNoneで表している)
def func():
pass # 何も返さない関数
print(func()) # None が返る
Pythonの関数はreturn
文を書かなかった場合、自動的にNone
を返します。明示的にreturn None
と書くこともできますが、意味としては同じです。
Noneの真偽値 (Falsyの仲間)
Noneはbool(真偽値)として評価すると必ずFalse
(偽)になります。このような『条件式で偽と判定される値』のことをfalsy
(フォールシー)と呼びます。0
や空文字列""
も同じく、条件式で偽と判定される値のひとつです。
print(bool(None)) # False
if文でNoneを判定する正しい方法 (is / is not の使い方)
『Noneはプログラムの実行中に必ず1つしか存在しない』という特徴があるため、ifの条件式で変数の値がNoneかどうかを調べるときには、必ずis
を使うのが正しいやり方になります。
==
で比べることもできますが、これはオブジェクトの『中身が等しいかどうか』を見る比較なので、場合によっては思わぬ挙動をします。NoneはFalse
と判定されるのでif not value:
のように書いても動きますが(変数valueの値がNone
だった場合に判定はTrue
になる)、この書き方だと変数valueの値が0
や空文字列(""
)、空リスト([]
)の時も同じようにTrue
という判定になってしまいます。『値がNoneかどうか』を確認したいなら、必ずis None
を使うべきです。また、『値がNoneではない』を確認する時はis not None
を使います。
value = None
# 『Noneである場合』を調べるとき
if value is None:
print("値はNoneです")
# 『Noneではない場合』を調べるとき
if value is not None:
print("値はNoneではありません")