TypeError: NoneType 对象不支持项目赋值
TypeError: NoneType object does not support item assignment
当我们尝试对值执行项目分配时,会出现 Python“TypeError: NoneType object does not support item assignment” None
。
要解决错误,请找出变量在何处被赋值None
并更正赋值。
下面是错误如何发生的示例。
主程序
my_list = None # ⛔️ TypeError: 'NoneType' object does not support item assignment my_list[0] = 'a'
我们试图为存储None
.
检查变量是否不存储 None
if
如果您需要
检查变量
在赋值之前是否未存储 None 值,请使用语句。
主程序
my_list = None if my_list is not None: my_list[0] = 'z' else: # 👇️ this runs print('variable stores a None value')
该if
块仅在变量未存储None
值时运行,否则,该else
块运行。
如果变量存储,则设置回退值None
或者,如果变量存储None
.
主程序
my_dict = None if my_dict is None: my_dict = {} my_dict['name'] = 'Bobby Hadz' print(my_dict) # 👉️ {'name': 'Bobby Hadz'}
如果变量存储一个None
值,我们将它设置为一个空字典。
追踪变量被赋予 None 值的位置
您必须弄清楚变量None
在代码中的何处被赋值,并将赋值更正为列表或字典。
最常见的None
价值来源是:
- 有一个不返回任何东西的函数(
None
隐式返回)。 - 将变量显式设置为
None
. - 将变量分配给调用不返回任何内容的内置函数的结果。
- 具有仅在满足特定条件时才返回值的函数。
不返回值的函数 returnNone
不显式返回值的函数 return None
。
主程序
# 👇️ this function returns None def get_list(): print(['a', 'b', 'c']) # 👇️ None my_list = get_list() # ⛔️ TypeError: 'NoneType' object does not support item assignment my_list[0] = 'z'
您可以使用return 语句从函数返回值。
主程序
def get_list(): return ['a', 'b', 'c'] # 👇️ ['a', 'b', 'c'] my_list = get_list() my_list[0] = 'z' print(my_list) # 👉️ ['z', 'b', 'c']
该函数现在返回一个列表,因此我们可以使用方括号安全地更改列表元素的值。
许多内置函数返回 None
请注意,有许多内置函数(例如sort()
)可以就地改变原始对象并返回None
。
主程序
a_list = ['c', 'b', 'a'] result = a_list.sort() print(result) # 👉️ None # ⛔️ TypeError: 'NoneType' object does not support item assignment result[0] = 'Z'
该sort()
方法就地改变列表并返回None
,因此我们不应该将调用它的结果存储到变量中。
要解决错误,请删除分配。
主程序
a_list = ['c', 'b', 'a'] a_list.sort() a_list[0] = 'Z' print(a_list) # 👉️ ['Z', 'b', 'c']
一个只有在满足条件时才返回值的函数
错误的另一个常见原因是具有仅在满足条件时才返回值的函数。
主程序
def get_list(a): if len(a) > 3: return a # 👇️ None my_list = get_list(['a', 'b'])
if
函数中的语句仅get_list
在传入参数的长度大于 时运行3
。
在所有其他情况下,该函数不返回任何内容并最终隐式返回
None
。要解决错误,您要么必须检查函数是否未返回
None
,要么在不满足条件时返回默认值。
主程序
def get_list(a): if len(a) > 3: return a return [] # 👈️ return an empty list if condition not met # 👇️ [] my_list = get_list(['a', 'b'])
现在,无论条件是否满足,函数都保证返回一个值。
想了解更多关于在 Python 中使用 None 的信息吗? 查看这些资源: 如何从 Python 中的字典中删除无值,如何从 Python 中的列表中删除无值。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: