sec03 - PythonのNoneとは?使い方・特徴・注意点を初心者向けに解説
スポンサーリンク

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ではありません")
スポンサーリンク