HOWTO · Python
Python NULL
このチュートリアルでは、Python での NULL について説明します
このページの内容
Python に NULL というキーワードはありません。NULL に相当する値として使われるのは、組み込みのシングルトン None です。これは、値が任意である場合や、オブジェクト参照がまだ設定されていない場合によく使われます。value is None で判定できます。None は NoneType 型の値であり、数値のゼロではありません。また、Python のコードで C 言語のようなポインターを代入することはありません。他の言語では NULL にそれぞれ固有の意味があるため、どの言語でも同じように動作すると考えないでください。
Python の値が None かどうかを確認する
通常は同一性演算子 is を使います。これは両辺が同じオブジェクトを参照しているかを調べるため、Python のシングルトンを判定するには value is None が明確です。関連するPython の変数が None かどうかを確認するガイドでも、同じ方法を説明しています。
次の自己完結した例を実行します。
values = [None, "ready"]
for value in values:
if value is None:
print("value is None")
else:
print("value is set")
value is None
value is set
is による判定では、None と文字列を区別できます。また、2つの分岐を使うこのパターンは、関数の引数、検索結果、任意のフィールドにも応用できます。例の値を、プログラムで調べたい変数に置き換えてください。
value == None は一般に推奨される書き方ではありません。等価性の判定はオブジェクトのクラスでカスタマイズできるため、「この値は None シングルトンである」という意味にならないことがあります。通常の値の内容を比べるときは等価性を使い、None の判定には同一性を使いましょう。この区別により、0、False、"" のような、偽と評価される別の値を None と取り違えることも避けられます。
Python で None の型を確認する
None の型を調べるには、その値を Python の組み込み関数 type() に渡します。返されるクラスの名前は NoneType です。None はシングルトンの値であり、NoneType はその型です。通常のコードでは型の確認より同一性による判定のほうが明確ですが、Python のオブジェクトを調べたり、診断情報を読んだりするときには type() が役立ちます。
次の短い例では、Python のクラスの完全な表記ではなく、クラス名を表示します。
value = None
print(type(value).__name__)
NoneType
この組み込み値の名前は NoneType です。None 自体をデータ型と呼ばないでください。None はその型を持つオブジェクトです。また、直接的な value is None の代わりに type(value) is type(None) を使うのも避けましょう。前者のほうが、判定したい内容をはっきり表します。
Python で None を未設定のオブジェクト参照として表す
Python の変数はオブジェクトを参照しますが、Python のコードでは代入可能な C 言語風のポインターは公開されていません。None は、別のノードがつながれる前の子ノードのように、まだ設定されていない任意の参照を表すためによく使われます。これは値の使い方に関する慣習であり、その属性の None が何を意味するかは周囲のプログラムによって決まります。
次の例では、任意の子参照を2つ持つノードを定義し、左の子が未設定かどうかを確認します。
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
root = Node("root")
print(root.left is None)
True
新しいノードでは left と right が None に設定され、後からどちらの属性にも別の Node を代入できます。最後の式は、左の子がまだ未設定かどうかを調べます。この例が示すのは Python のオブジェクト参照であり、C 言語のように参照先をたどったり、NULL アドレスを代入したりできるポインターではありません。Python の None は、慣習として「値がない」ことを示す通常のオブジェクト値です。任意の参照を使う前に、その値を明示的に確認してください。