TypeError: ‘NoneType’ object is not subscriptable とは
PythonでTypeError: ‘NoneType’ object is not subscriptableが発生するのは、値がNoneであるオブジェクトに対してインデックスアクセス([])やスライス操作を行った場合です。つまり、変数の中身がNoneなのに、リストや辞書のようにアクセスしようとしたときにこのエラーが発生します。
エラーの発生パターン
このエラーは主に以下のようなケースで発生します。
パターン1: 戻り値がNoneの関数の結果にアクセス
# リストのsort()はNoneを返す
data = [3, 1, 2]
result = data.sort() # result は None
print(result[0]) # TypeError: 'NoneType' object is not subscriptable
sort()はリストをその場で(in-place)ソートし、戻り値はNoneです。ソート結果を変数に代入したい場合はsorted()を使用します。
# 修正例
data = [3, 1, 2]
result = sorted(data)
print(result[0]) # 1
パターン2: 辞書やAPIレスポンスのキーが存在しない
response = {"user": None}
name = response["user"]["name"] # TypeError
ネストされた辞書でキーの値がNoneの場合、さらに深い階層にアクセスするとエラーになります。
# 修正例: get()でデフォルト値を設定する
user = response.get("user") or {}
name = user.get("name", "不明")
パターン3: 正規表現のマッチ失敗
import re
match = re.search(r'\d+', 'abc') # マッチしない → None
print(match[0]) # TypeError
# 修正例: マッチ結果を確認してからアクセス
match = re.search(r'\d+', 'abc')
if match:
print(match[0])
else:
print("マッチなし")
根本原因の特定方法
このエラーをデバッグする際は、まずトレースバック(Traceback)でエラーが発生した行を特定します。その行で[]を使ってアクセスしている変数の値をprint()やtype()で確認してください。
# デバッグ例
print(type(result)) # <class 'NoneType'> と表示されたら原因特定
print(result) # None
防止策とベストプラクティス
このエラーを未然に防ぐには、以下のアプローチが有効です。Noneチェックを明示的に行うことが最も基本的な対策です。辞書アクセスには.get()メソッドを使い、デフォルト値を設定しましょう。型ヒント(type hints)を活用すると、IDEが事前に警告を出してくれる場合もあります。
# 防止策まとめ
# 1. 明示的なNoneチェック
if result is not None:
value = result[0]
# 2. 辞書には.get()を使う
value = data.get("key", "デフォルト値")
# 3. 型ヒントで意図を明確化
from typing import Optional, List
def get_data() -> Optional[List[str]]:
...
Stack Overflowでの質問状況
Stack Overflowでは、Pythonに関する質問が約2,221,413件投稿されており、TypeErrorは最も頻繁に質問されるエラーカテゴリの一つです。NoneType関連のエラーは初心者からの質問が特に多く、実務でも発生頻度の高いエラーといえます。
よくある質問(FAQ)
-
QNoneType object is not subscriptable と not callable の違いは何ですか?
-
A
not subscriptableはNoneに対して[]でアクセスした場合に発生します。一方、not callableはNoneに対して()で関数呼び出しをした場合に発生します。どちらも変数がNoneであることが根本原因です。
-
QこのエラーはPython 2でも発生しますか?
-
A
はい、Python 2でも同じエラーが発生します。ただしエラーメッセージの表記がわずかに異なる場合があります。現在はPython 3系の使用が推奨されています。
-
QNoneを返す代表的な組み込みメソッドは何ですか?
-
A
リストのsort()、append()、extend()、reverse()、辞書のupdate()、セットのadd()などはすべてNoneを返します。これらのメソッドはオブジェクトをその場で変更し、新しいオブジェクトは返しません。



コメント