TypeError: 'NoneType' object is not subscriptable

Last Updated on 2025年7月28日

概要

Pythonでプログラムを実行していると「TypeError: 'NoneType' object is not subscriptable」というエラーに遭遇することがあります。これは、リストや辞書のようなデータ構造に対してインデックスアクセスをしようとした際に、対象の変数が None(=中身が空)である場合に発生するエラーです。

特に初心者にとっては原因がわかりにくく、何をどう修正すればよいか混乱しがちです。本記事では、このエラーが発生する原因とその解決策について、具体例を交えて丁寧に解説します。

目次

エラー内容

実際のエラーは以下のようなメッセージで出力されます。

ここで「'NoneType' object is not subscriptable」という部分が重要です。これは、「None型(NoneType)のオブジェクトは、インデックスでアクセスできない(=添え字が使えない)」という意味になります。

原因

このエラーが起きる主な原因は、以下のように「Noneをリストや辞書のようにアクセスしようとした」場合です。

例1: 関数の戻り値がNone

このコードでは、関数 get_data()return 文を持たないため、戻り値は None になります。そのため result[0] のようにインデックスアクセスするとエラーになります。

例2: 辞書に存在しないキーを使う

dict.get() は、存在しないキーを指定した場合に None を返すため、ここでも [0] によってエラーが出ます。

例3: 条件分岐で代入漏れがある

対処法

エラーを解消するには、「その変数がNoneでないこと」を確認してから添え字アクセスを行うことが重要です。以下の方法で対処できます。

方法1: returnの確認

方法2: Noneチェック

方法3: get() にデフォルト値を渡す

方法4: try-exceptで囲む(注意付き)

ただし、本来はエラーを起こさないようにロジックを整えるべきであり、try-exceptは最終手段です。

補足

このエラーは、Pythonの柔軟さの裏にある「静的型チェックがない」特徴によって起きやすいものです。以下の工夫でミスを予防できます。

●型ヒントを使う

これによりエディタや型チェッカーが「Noneを返していないか」を警告してくれることがあります。

●mypyなどの型チェッカーを活用する

mypyを使うと、以下のようなコードに対して「Noneの可能性がある」と教えてくれます。

●デバッグ時にprintで型を確認

まとめ

  • TypeError: 'NoneType' object is not subscriptable は「Noneに対して添え字アクセスを試みた」ときに出る
  • 関数の戻り値忘れ、辞書のキー取得ミス、条件分岐の漏れが主な原因
  • if value is not None: などでチェックすることが基本
  • 型ヒントやmypyを活用すれば未然にミスを防げる
  • try-exceptは最終手段。まずはロジックを整理しよう

Pythonは柔軟な反面、このような見落としが発生しやすい言語です。丁寧にコードを確認し、型や戻り値を意識した設計を心がけることで、こうしたエラーを回避できます。