Skip to content

理解元组的不可变性

就像列表一样,+= 操作也适用于元组,并将新项添加到其中。

python
>>> t = ("Hi", "Ed", "Punk")
>>> t += (1, 2)
>>> t
('Hi', 'Ed', 'Punk', 1, 2)

但是元组不是不可变的吗? 那我们怎么能修改它呢?

为了更好地理解它,让我们回顾一下当我们在列表上应用 += 运算符时会发生什么。

python
>>> l = ["Hi", "Ed", "Punk"]
>>> id_l = id(l)
>>> l += [1, 2]
>>> l
['Hi', 'Ed', 'Punk', 1, 2]
>>> id(l) == id_l
True

对于列表,修改后的列表 l 仍然指向同一个对象。

现在,让我们向元组添加项。

python
>>> t = ("Hi", "Ed", "Punk")
>>> id_t = id(t)
>>> t += (1, 2)
>>> t
('Hi', 'Ed', 'Punk', 1, 2)
>>> id(t) == id_t
False

对于元组,修改后的元组实际上是一个全新的元组,包含原始元组的内容和扩展部分。

原始元组没有被修改,因为它是不可变的。但是,由于 t 不再指向原始元组,原始元组会从内存中释放。

因此,建议使用连接(+)来创建新元组,而不是使用 += (如果目的是暗示修改)。如果代码试图通过像 append()extend() 这样的方法修改元组(这些方法元组本身并不支持),则会引发错误,这有助于保持其不可变性。

python
>>> l = ["Hi", "Ed", "Punk"]
>>> l.extend([1, 2])
>>> l
['Hi', 'Ed', 'Punk', 1, 2]

>>> t = ("Hi", "Ed", "Punk")
>>> t.extend((1, 2)) # 元组没有 extend 方法
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'extend'