TypeError:“NoneType”对象在 Python 中不可下标

TypeError: ‘NoneType’ 对象在 Python 中不可下标

TypeError: ‘NoneType’ object is not subscriptable in Python

None当我们尝试访问特定索引处的值时,会发生 Python“TypeError: ‘NoneType’ object is not subscriptable” 。

要解决该错误,请跟踪变量的分配位置None并更正对列表、元组、字典或字符串的分配。

typeerror nonetype 对象不可下标

以下是错误发生方式的示例。

主要.py
a_list = None # ⛔️ TypeError: 'NoneType' object is not subscriptable result = a_list[0] # 👈️ accessing None at an index

我们尝试访问None导致错误的特定索引处的值。

这是另一个例子。

主要.py
a_list = ['bobby', 'hadz', 'com'] result = a_list.sort() # 👈️ sort() returns None # ⛔️ TypeError: 'NoneType' object is not subscriptable result[0]

list.sort()在第二个示例中,由于我们将调用结果分配给了变量而导致了错误。

sort()reverse()、 、方法就地改变原始对象并返回 append()extend()None

改变对象的内置方法返回 None

在这种情况下,您可以通过删除分配来解决该错误。

主要.py
a_list = ['bobby', 'hadz', 'com'] a_list.sort() # 👈️ sort() returns None print(a_list) # 👉️ ['bobby', 'com', 'hadz'] print(a_list[0]) # 👉️ bobby

Python 中有一个约定,即就地改变对象以
返回None的方法。

追踪变量被赋予 None 值的位置

要解决所有其他情况下的错误,您必须跟踪为变量赋值的位置None并更正分配。

最常见的None值来源是:

  1. 有一个不返回任何内容的函数(None隐式返回)。
  2. 显式地将变量设置为None.
  3. 将变量分配给调用不返回任何内容的内置函数的结果。
  4. 具有仅在满足特定条件时才返回值的函数。

忘记从函数返回值

确保您没有忘记从函数返回一个值。

主要.py
# 👇️ this function returns None def get_list(): print(['bobby', 'hadz', 'com']) result = get_list() print(result) # 👉️ None # ⛔️ TypeError: 'NoneType' object is not subscriptable print(result[0])
result变量存储一个None值,因为所有不显式返回值的 Python 函数都会返回None

要解决该错误,请使用
return 语句从函数返回一个值。

主要.py
def get_list(): return ['bobby', 'hadz', 'com'] result = get_list() print(result) # 👉️ ['bobby', 'hadz', 'com'] print(result[0]) # bobby

在索引处访问变量之前检查变量是否不存储 None

如果您需要
在特定索引处访问变量之前
检查变量是否不存储 Noneif ,请使用语句。

主要.py
a_list = None if a_list is not None: print(a_list[0]) else: # 👇️ this runs print('The variable stores a None value')

if仅当变量不存储值时该块才会运行None,否则该else块就会运行。

仅当满足条件时才返回值

错误的另一个常见原因是函数仅在满足条件时才返回值。

主要.py
def get_list(a): if len(a) > 3: return a # 👇️ None my_list = get_list(['bobby', 'hadz']) # ⛔️ TypeError: 'NoneType' object is not subscriptable print(my_list[0])

仅当传入参数的长度大于 时,才会运行函数if中的语句get_list3

在所有其他情况下,该函数不会返回任何内容并最终隐式返回None.

如果不满足条件则返回默认值

要解决该错误,您必须检查函数是否未返回
None,或者如果不满足条件则返回默认值。

主要.py
def get_list(a): if len(a) > 3: return a return ['default value'] # 👇️ ['default value'] my_list = get_list(['bobby', 'hadz']) print(my_list[0]) # 👉️ 'default value'

现在,无论是否满足条件,该函数都保证返回一个值。

print() 函数返回 None

print()当将函数的输出存储在变量中时,由于print()returns ,通常也会发生该错误None

主要.py
variable = print('Some message') print(variable) # 👉️ None # ⛔️ TypeError: 'NoneType' object is not subscriptable print(variable[:5])

如果您尝试对传递给
print()函数的值进行切片,请在括号内使用方括号。

主要.py
print('Some message'[:4]) # 👉️ 'Some'

您可以将鼠标悬停在 IDE 中的函数上以查看它是否返回None

“对象不可下标”TypeError 基本上意味着无法使用方括号访问该对象。

您应该只使用方括号来访问可下标的对象。

Python 中可下标的对象有:

  • 列表
  • 元组
  • 字典
  • 细绳

所有其他对象必须使用
list()tuple()
dict()
str()类转换为可下标对象,才能使用括号表示法。

可订阅的对象实现该__getitem__方法,而不可订阅的对象则不会。

主要.py
a_list = [1, 2, 3] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)
想要了解有关在 Python 中使用 None 的更多信息 查看这些资源: 如何从 Python 中的字典中删除 None 值如何从 Python 中的列表中删除 None 值

额外资源

您可以通过查看以下教程了解有关相关主题的更多信息: