Python TypeError: ‘NoneType’ object is not subscriptable の原因と解決方法

TypeError: ‘NoneType’ object is not subscriptable とは

PythonでTypeError: ‘NoneType’ object is not subscriptableが発生するのは、値がNoneであるオブジェクトに対してインデックスアクセス([])やスライス操作を行った場合です。つまり、変数の中身が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("マッチなし")
re.search() や re.match() はマッチしなかった場合にNoneを返します。正規表現の結果には必ずNoneチェックを入れましょう。

根本原因の特定方法

このエラーをデバッグする際は、まずトレースバック(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]]:
    ...
.get()メソッドはKeyErrorの防止にも有効です。API連携やJSON処理では積極的に活用しましょう。

Stack Overflowでの質問状況

Stack Overflowでは、Pythonに関する質問が約2,221,413件投稿されており、TypeErrorは最も頻繁に質問されるエラーカテゴリの一つです。NoneType関連のエラーは初心者からの質問が特に多く、実務でも発生頻度の高いエラーといえます。

よくある質問(FAQ)

Q
NoneType object is not subscriptable と not callable の違いは何ですか?
A

not subscriptableはNoneに対して[]でアクセスした場合に発生します。一方、not callableはNoneに対して()で関数呼び出しをした場合に発生します。どちらも変数がNoneであることが根本原因です。

Q
このエラーはPython 2でも発生しますか?
A

はい、Python 2でも同じエラーが発生します。ただしエラーメッセージの表記がわずかに異なる場合があります。現在はPython 3系の使用が推奨されています。

Q
Noneを返す代表的な組み込みメソッドは何ですか?
A

リストのsort()、append()、extend()、reverse()、辞書のupdate()、セットのadd()などはすべてNoneを返します。これらのメソッドはオブジェクトをその場で変更し、新しいオブジェクトは返しません。

免責事項: 当記事の情報は執筆時点の内容に基づいています。最新情報は各公式サイトをご確認ください。当サイトは情報提供を目的としており、資格取得・技術的対応の結果について一切の責任を負いません。




コメント

YouTubeも運営中。チャンネル登録はこちら!!
Python
デプロイ太郎のSNSを見てみる!!
タイトルとURLをコピーしました