理解元组的不可变性
就像列表一样,+=
操作也适用于元组,并将新项添加到其中。
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'