Pythonで「未定義(undefined)」の状態を判定するというのは、ある変数やオブジェクトが存在するか(定義されているか)を調べることを意味します。
これはJavaScriptのように「undefined
」という明示的な値が存在する言語とは異なり、Pythonでは未定義の変数にアクセスしようとすると即エラー(NameError
)になります。
以下に、Pythonで「未定義かどうかを判定する」ための代表的な方法を、具体的なシチュエーションごとに詳しく解説します。
目次
変数が定義されているか確認する方法
方法①: try-except
文を使う(最も安全かつ一般的)
try:
x
except NameError:
print("xは未定義です")
else:
print("xは定義済みです")
- メリット: 変数が完全に未定義でも安全にチェック可能。
- デメリット: 多少冗長に感じる場合がある。
方法②: globals()
または locals()
を使う
if 'x' in globals():
print("xは定義されています(グローバルスコープ)")
else:
print("xは未定義です(グローバルスコープ)")
またはローカルスコープでは
if 'x' in locals():
print("xは定義されています(ローカルスコープ)")
- 使い分け:
globals()
→ モジュールや関数の外で定義された変数を確認locals()
→ 関数の中で定義された変数を確認
- 注意: 存在確認はできますが、未定義な状態でアクセスしようとすると
NameError
は避けられません。
None
との比較による存在チェック
これは「変数は定義されている前提」で使う手法です。
x = None # 初期値を明示的に設定
if x is None:
print("xはNone(実質的に未定義)")
else:
print("xには値が設定されている")
- 注意: 変数が定義されていないとこのコードは動きません。
- ユースケース: 関数の引数や辞書キーなどで「未定義状態にNoneを使う」という設計。
hasattr()
や in
を使ったオブジェクト属性や辞書キーの存在チェック
クラスやオブジェクト属性の判定
class Sample:
pass
s = Sample()
if hasattr(s, 'value'):
print("value属性は定義されています")
else:
print("value属性は未定義です")
辞書での未定義(キーが存在しない)チェック
d = {'name': 'Alice'}
if 'age' in d:
print("ageは定義済み")
else:
print("ageは未定義(キーが存在しない)")
__dict__
を使って変数や属性の存在を調べる
オブジェクトの変数一覧は __dict__
で確認できます。
class Person:
def __init__(self):
self.name = 'Alice'
p = Person()
print('name' in p.__dict__) # True
print('age' in p.__dict__) # False
これはより内部的な確認が必要なときに便利です。
まとめ:Pythonで「未定義かどうか」を確認する主な方法

方法 | 判定対象 | 説明 |
---|---|---|
try-except NameError | 任意の変数 | 最も汎用的、安全 |
'var' in globals() | グローバル変数 | 明示的に存在確認 |
'var' in locals() | ローカル変数 | 関数スコープ内で確認 |
if var is None | 初期化済み変数 | None で未設定か判定 |
'key' in dict | 辞書のキー | 安全で高速 |
hasattr(obj, 'attr') | オブジェクト属性 | クラスやインスタンス変数用 |
補足:未定義エラーの種類
NameError
: 変数がまったく定義されていないときAttributeError
: 属性が定義されていないときKeyError
: 辞書のキーが存在しないとき
それぞれに応じたチェックが必要です。
以上、Pythonの未定義の判定についてでした。
最後までお読みいただき、ありがとうございました。