TypeError: ‘NoneType’ 对象在 Python 中不可下标
TypeError: ‘NoneType’ object is not subscriptable in Python
None
当我们尝试访问特定索引处的值时,会发生 Python“TypeError: ‘NoneType’ object is not subscriptable” 。
要解决该错误,请跟踪变量的分配位置None
并更正对列表、元组、字典或字符串的分配。
以下是错误发生方式的示例。
a_list = None # ⛔️ TypeError: 'NoneType' object is not subscriptable result = a_list[0] # 👈️ accessing None at an index
我们尝试访问None
导致错误的特定索引处的值。
这是另一个例子。
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
在这种情况下,您可以通过删除分配来解决该错误。
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
值来源是:
- 有一个不返回任何内容的函数(
None
隐式返回)。 - 显式地将变量设置为
None
. - 将变量分配给调用不返回任何内容的内置函数的结果。
- 具有仅在满足特定条件时才返回值的函数。
忘记从函数返回值
确保您没有忘记从函数返回一个值。
# 👇️ 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 语句从函数返回一个值。
def get_list(): return ['bobby', 'hadz', 'com'] result = get_list() print(result) # 👉️ ['bobby', 'hadz', 'com'] print(result[0]) # bobby
在索引处访问变量之前检查变量是否不存储 None
如果您需要
在特定索引处访问变量之前检查变量是否不存储 Noneif
,请使用语句。
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
块就会运行。
仅当满足条件时才返回值
错误的另一个常见原因是函数仅在满足条件时才返回值。
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_list
3
None
.如果不满足条件则返回默认值
要解决该错误,您必须检查函数是否未返回
None
,或者如果不满足条件则返回默认值。
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
。
variable = print('Some message') print(variable) # 👉️ None # ⛔️ TypeError: 'NoneType' object is not subscriptable print(variable[:5])
如果您尝试对传递给
print()函数的值进行切片,请在括号内使用方括号。
print('Some message'[:4]) # 👉️ 'Some'
您可以将鼠标悬停在 IDE 中的函数上以查看它是否返回None
。
“对象不可下标”TypeError 基本上意味着无法使用方括号访问该对象。
您应该只使用方括号来访问可下标的对象。
Python 中可下标的对象有:
- 列表
- 元组
- 字典
- 细绳
所有其他对象必须使用
list()
、tuple()、
dict()或
str()类转换为可下标对象,才能使用括号表示法。
可订阅的对象实现该__getitem__
方法,而不可订阅的对象则不会。
a_list = [1, 2, 3] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)
额外资源
您可以通过查看以下教程了解有关相关主题的更多信息: