TypeError を解決する: Nonetype オブジェクトは Python でサブスクリプト可能ではありません
-
Python の
TypeError: 'NoneType' object is not subscriptable -
Python で
TypeError: 'NoneType' object is not subscriptableを解決する - まとめ
Python には、インデックス作成をサポートするリスト、タプル、辞書などのさまざまなシーケンス データ型があります。 添字という用語は索引付け中に使用される値を指すため、これらのオブジェクトは添字可能オブジェクトとも呼ばれます。
Python では、このような添字可能なオブジェクトの不適切なインデックス付けは、多くの場合、TypeError: 'NoneType' object is not subscriptableという結果になります。 この記事では、このエラーと、これを修正するために考えられる解決策について説明します。
準備? さぁ、始めよう!
Python の TypeError: 'NoneType' object is not subscriptable
TypeError: 'NoneType' object is not subscriptable が発生する理由とその修正方法を確認する前に、まずいくつかの基本事項を理解しておきましょう。
Python の NoneType と添字可能オブジェクトの紹介
Python では、NoneType オブジェクトは値を持たないオブジェクトです。 つまり、何も返さないオブジェクトです。
値 None は、何かを検索しても見つからない関数によって返されることがよくあります。 以下は、関数が None 値を返す例です。
def none_demo():
for i in [1, 2, 3, 4, 5]:
if i == 10:
return yes
ans = none_demo()
print(ans)
出力:
None
添え字付け可能なオブジェクトについて言えば、その名前が示すように、これらは添え字付けまたはインデックス付けが可能な Python オブジェクトです。 簡単に言えば、添字可能なオブジェクトとは、0、1 などのインデックス値を使用してアクセスまたはトラバースできるオブジェクトです。
リスト、タプル、および辞書は、そのようなオブジェクトの例です。 以下は、インデックスを使用してリストをトラバースする方法を示すコードです。
cakes = ["Mango", "Vanilla", "Chocolate"]
for i in range(0, 3):
print(cakes[i])
出力:
Mango
Vanilla
Chocolate
基本がよくわかったので、先に進みましょう!
Python で TypeError: 'NoneType' object is not subscriptable を解決する
Python には、添字可能なオブジェクトで使用できる reverse()、sort()、append() などの組み込み関数がいくつかあります。 しかし、これらの組み込み関数の結果を変数に割り当てると、TypeError: 'NoneType' object is not subscriptableという結果になります。
以下の例を見てください。 ここでは、desserts というリストで reverse() 関数を使用し、その結果を変数 ans に格納しました。
次に、変数 ans の値を出力しました。出力に見られるように、None であることがわかりました。 ただし、最後のステートメントは TypeError: 'NoneType' object is not subscriptable につながります。
なぜこれが起こったのか推測できますか?
desserts = ["cakes", "pie", "cookies"]
ans = desserts.reverse()
print("The variable ans contains: ", ans)
print(ans[0])
出力:
The variable ans contains: None
Traceback (most recent call last):
File "<string>", line 4, in <module>
TypeError: 'NoneType' object is not subscriptable
これは、最後の行で変数 ans を添字付けしているためです。 変数 ans には、シーケンス データ型ではない値 None が含まれていることがわかっています。 したがって、索引付けによってアクセスすることはできません。
ここで理解しておくべき重要なことは、反転したリストを変数 ans に代入していますが、その変数 ans をリスト型にするわけではないということです。 したがって、インデックスを使用して変数 ans にアクセスすることはできず、それをリストとして考えます。
実際には、変数 ans は NoneType オブジェクトであり、Python はそのようなオブジェクトのインデックス作成をサポートしていません。 したがって、添え字を付けられないオブジェクトにインデックスを付けようとしてはなりません。そうしないと、TypeError: 'NoneType' object is not subscriptable が発生します。
上記のコードからこの問題を修正するには、以下のアプローチに従ってください。
今回は reverse() 操作の結果を変数に代入しません。 そうすれば、関数は余分なスペースなしで現在のリストを反転したリストに自動的に置き換えます。
後で、必要に応じてリストを印刷できます。 ここでは、最初に反転リスト全体を出力し、次に添字 0 を使用して最初の要素にアクセスしています。
ご覧のとおり、コードは正常に実行され、目的の出力が得られます。
desserts = ["cakes", "pie", "cookies"]
desserts.reverse()
print(desserts)
print(desserts[0])
出力:
['cookies', 'pie', 'cakes']
cookies
結果を変数に代入せずにインデックスを作成するという同じ規則は、sort() や append() などの他の関数にも適用されます。 以下は、sort() 関数を使用し、TypeError: 'NoneType' object is not subscriptable に遭遇する例です。
desserts = ["cakes", "pie", "cookies"]
ans = desserts.sort()
print("The value of the variable is: ", ans)
print(ans[1])
出力:
The value of the variable is: None
Traceback (most recent call last):
File "<string>", line 4, in <module>
TypeError: 'NoneType' object is not subscriptable
繰り返しますが、これは同じ理由で発生します。 このエラーを取り除くには、ソートされたリストを格納する別の変数の使用をやめなければなりません。
これは以下で行われます。
desserts = ["cakes", "pie", "cookies"]
desserts.sort()
print(desserts)
print(desserts[1])
出力:
['cakes', 'cookies', 'pie']
cookies
今回は、sort() メソッドが、余分なスペースを必要とせずにリストを新しいソート済みリストに置き換えていることがわかります。 後で、このエラーを心配することなく、インデックスを使用して並べ替えられたリストの個々の要素にアクセスできます!
そして、ここに興味深いことがあります。 聞く準備はできましたか?
sort() 関数の場合、別の変数を使用してソート済みリストを保存したい場合は、sorted() 関数を使用できます。 これは以下で行われます。
desserts = ["cakes", "pie", "cookies"]
ans = sorted(desserts)
print(ans)
print(ans[0])
出力:
['cakes', 'cookies', 'pie']
cakes
リストをその場でソートする sort() メソッドとは異なり、sorted() 関数はソートされたリストを返すため、これによってエラーが発生しないことがわかります。
しかし、残念ながら、reverse() および append() メソッドの代替関数はありません。
今回の記事は以上です。 このトピックの詳細については、この ドキュメントを参照してください。
まとめ
この記事では、Python の 'NoneType' object not subscriptable TypeError について説明しました。 reverse() や append() などの実行操作の値を変数に代入すると、どのようにこのエラーが発生するかを見てきました。
また、そもそもこのエラーを回避するために、sort() 関数の代わりに sorted() 関数を使用してこのエラーを修正する方法も確認しました。
関連記事 - Python Error
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません