Last Updated on 2025年7月28日
概要
Pythonでプログラムを実行していると「TypeError: 'NoneType' object is not subscriptable」というエラーに遭遇することがあります。これは、リストや辞書のようなデータ構造に対してインデックスアクセスをしようとした際に、対象の変数が None(=中身が空)である場合に発生するエラーです。
特に初心者にとっては原因がわかりにくく、何をどう修正すればよいか混乱しがちです。本記事では、このエラーが発生する原因とその解決策について、具体例を交えて丁寧に解説します。
目次
エラー内容
実際のエラーは以下のようなメッセージで出力されます。
|
1 2 3 4 5 |
Traceback (most recent call last): File "example.py", line 2, in <module> print(data[0]) TypeError: 'NoneType' object is not subscriptable |
ここで「'NoneType' object is not subscriptable」という部分が重要です。これは、「None型(NoneType)のオブジェクトは、インデックスでアクセスできない(=添え字が使えない)」という意味になります。
原因
このエラーが起きる主な原因は、以下のように「Noneをリストや辞書のようにアクセスしようとした」場合です。
例1: 関数の戻り値がNone
|
1 2 3 4 5 6 7 |
def get_data(): # 実際にはreturnを書き忘れている data = [1, 2, 3] result = get_data() print(result[0]) # ← エラー発生 |
このコードでは、関数 get_data() が return 文を持たないため、戻り値は None になります。そのため result[0] のようにインデックスアクセスするとエラーになります。
例2: 辞書に存在しないキーを使う
|
1 2 3 |
my_dict = {"name": "Taro"} value = my_dict.get("age")[0] # ← エラー発生 |
dict.get() は、存在しないキーを指定した場合に None を返すため、ここでも [0] によってエラーが出ます。
例3: 条件分岐で代入漏れがある
|
1 2 3 4 5 6 |
data = None if some_condition: data = [10, 20, 30] print(data[1]) # some_conditionがFalseだとdataはNoneのまま |
対処法
エラーを解消するには、「その変数がNoneでないこと」を確認してから添え字アクセスを行うことが重要です。以下の方法で対処できます。
方法1: returnの確認
|
1 2 3 4 5 6 7 |
def get_data(): return [1, 2, 3] # return を明示 result = get_data() if result: print(result[0]) |
方法2: Noneチェック
|
1 2 3 4 5 6 |
value = my_dict.get("age") if value is not None: print(value[0]) else: print("年齢データがありません") |
方法3: get() にデフォルト値を渡す
|
1 2 3 |
value = my_dict.get("age", []) print(value[0] if value else "データなし") |
方法4: try-exceptで囲む(注意付き)
|
1 2 3 4 5 |
try: print(value[0]) except TypeError: print("値がNoneでアクセスできませんでした") |
ただし、本来はエラーを起こさないようにロジックを整えるべきであり、try-exceptは最終手段です。
補足
このエラーは、Pythonの柔軟さの裏にある「静的型チェックがない」特徴によって起きやすいものです。以下の工夫でミスを予防できます。
●型ヒントを使う
|
1 2 3 |
def get_data() -> list[int]: return [1, 2, 3] |
これによりエディタや型チェッカーが「Noneを返していないか」を警告してくれることがあります。
●mypyなどの型チェッカーを活用する
mypyを使うと、以下のようなコードに対して「Noneの可能性がある」と教えてくれます。
|
1 2 3 4 5 6 |
# インストール pip install mypy # チェック mypy your_script.py |
●デバッグ時にprintで型を確認
|
1 2 |
print(type(result)) # <class 'NoneType'> |
まとめ
- TypeError: 'NoneType' object is not subscriptable は「Noneに対して添え字アクセスを試みた」ときに出る
- 関数の戻り値忘れ、辞書のキー取得ミス、条件分岐の漏れが主な原因
if value is not None:などでチェックすることが基本- 型ヒントやmypyを活用すれば未然にミスを防げる
- try-exceptは最終手段。まずはロジックを整理しよう
Pythonは柔軟な反面、このような見落としが発生しやすい言語です。丁寧にコードを確認し、型や戻り値を意識した設計を心がけることで、こうしたエラーを回避できます。


