类型错误:“元组”对象不支持项目分配

TypeError: ‘tuple’ 对象不支持项目赋值

TypeError: ‘tuple’ object does not support item assignment

Python“TypeError: ‘tuple’ object does not support item assignment”发生在我们尝试更改元组中某个项目的值时。

要解决该错误,请将元组转换为列表,更改特定索引处的项目并将列表转换回元组。

typeerror 元组对象不支持项目分配

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

主程序
my_tuple = ('a', 'b', 'c') # ⛔️ TypeError: 'tuple' object does not support item assignment my_tuple[0] = 'z'

我们尝试更新元组中的元素,但元组对象是不可变的,这导致了错误。

将元组转换为列表解决错误

我们不能为元组的单个项目赋值。

相反,我们必须将元组转换为列表。

主程序
my_tuple = ('a', 'b', 'c') # ✅ convert the tuple to a list my_list = list(my_tuple) print(my_list) # 👉️ ['a', 'b', 'c'] # ✅ update the item my_list[0] = 'z' # ✅ convert the list back to a tuple my_tuple = tuple(my_list) print(my_tuple) # 👉️ ('z', 'b', 'c')

这是一个三步过程:

  1. 使用list()类将元组转换为列表。
  2. 更新指定索引处的项目。
  3. 使用该类tuple()将列表转换回元组。
这是必要的,因为元组是不可变的,而列表是可变的。

一旦有了列表,我们就可以更新指定索引处的项目,并可选择将结果转换回元组。

Python 索引是从零开始的,因此元组中的第一项的索引为0,最后一项的索引为-1or len(my_tuple) - 1

用更新后的元素构造一个新的元组

或者,您可以构造一个新的元组,其中包含指定索引处的更新元素。

主程序
def get_updated_tuple(tup, index, new_value): return tup[:index] + (new_value, ) + tup[index + 1:] my_tuple = ('a', 'b', 'c', 'd', 'e') index_to_update = 1 updated_value = 'Z' new_tuple = get_updated_tuple(my_tuple, index_to_update, updated_value) # 👇️ ('a', 'Z', 'c', 'd', 'e') print(new_tuple)

get_updated_tuple函数采用一个元组、一个索引和一个新值,并返回一个新元组,该新元组具有指定索引处的更新值。

原始元组保持不变,因为元组是不可变的。

我们更新了 index 处的元组元素1,将其设置为Z

如果你只需要这样做一次,你就不必定义一个函数。

主程序
my_tuple = ('a', 'b', 'c', 'd', 'e') index_to_update = 1 updated_value = 'Z' # 👇️ notice that the updated_value is wrapped in a tuple new_tuple = my_tuple[:index_to_update] + \ (updated_value,) + my_tuple[index_to_update + 1:] # 👇️ ('a', 'Z', 'c', 'd', 'e') print(new_tuple)

代码示例在不使用可重用函数的情况下实现了相同的结果。

请注意,我们必须updated_value用尾随逗号将括号括起来。

加法 (+) 运算符左右两侧的值
必须都是元组。

元组切片的语法

my_tuple[start:stop:step].

索引start是包含的,stop索引是排他的(最多,但不包括)。

如果start省略索引,则认为是0,如果stop省略索引,则切片转到元组的末尾。

使用列表而不是元组

或者,您可以通过将元素括在方括号(而不是圆括号)中来从头开始声明列表。

主程序
my_list = ['a', 'b', 'c'] my_list[0] = 'z' print(my_list) # 👉️ ['z', 'b', 'c'] my_list.append('d') print(my_list) # 👉️ ['z', 'b', 'c', 'd'] my_list.insert(0, '.') print(my_list) # 👉️ ['.', 'z', 'b', 'c', 'd']

如果您必须经常更改集合中的值,则从头开始声明一个列表会更有效率。

元组旨在存储永不改变的值。

您可以使用该append()方法将项目添加到列表末尾或使用该insert()方法在特定索引处添加项目。

元组在 Python 中是如何构造的

万一你错误地声明了一个元组,元组有多种构造方式:

  • 使用一对括号()创建一个空元组
  • 使用尾随逗号 –a,(a,)
  • 用逗号分隔项目 –a, b(a, b)
  • 使用tuple()构造函数

检查值是否为元组

您还可以通过在赋值之前检查值是否为元组来处理错误。

主程序
my_tuple = ('a', 'b', 'c') if isinstance(my_tuple, tuple): my_tuple = list(my_tuple) my_tuple[0] = 'Z' print(my_tuple) # 👉️ ['Z', 'b', 'c']

如果变量存储一个元组,我们将它设置为一个列表,以便能够更新指定索引处的值。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

如果不确定变量存储的类型,请使用内置type()类。

主程序
my_tuple = ('a', 'b', 'c') print(type(my_tuple)) # 👉️ <class 'tuple'> print(isinstance(my_tuple, tuple)) # 👉️ True my_list = ['bobby', 'hadz', 'com'] print(type(my_list)) # 👉️ <class 'list'> print(isinstance(my_list, list)) # 👉️ True

类型

返回对象的类型。

额外资源

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