TypeError: NoneType 对象不支持项目分配

TypeError: NoneType 对象不支持项目赋值

TypeError: NoneType object does not support item assignment

当我们尝试对值执行项目分配时,会出现 Python“TypeError: NoneType object does not support item assignment” None

要解决错误,请找出变量在何处被赋值None并更正赋值。

typeerror nonetype 对象不支持项目分配

下面是错误如何发生的示例。

主程序
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价值来源是:

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

不返回值的函数 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 中的列表中删除无值

额外资源

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