python元组是不可变的 - 所以为什么我可以添加元素

时间:2013-09-25 21:44:36

标签: python tuples immutability

在阅读以下代码片段时,我已经使用Python已经有一段时间了:

>>> a = (1,2)
>>> a += (3,4)
>>> a
(1, 2, 3, 4)

我问自己一个问题:为什么python元组是不可变的,我可以在它们上使用+=运算符(或者更一般地说,为什么我可以修改元组)?我无法回答自己。

我理解了不变性,虽然它们不像列表那样受欢迎,但元组在python中很有用。但是不可改变并且能够修改长度似乎与我相矛盾......

3 个答案:

答案 0 :(得分:25)

5也是不可改变的。当您拥有不可变数据结构时,a += b等同于a = a + b,因此会创建一个新数字,元组或其他内容。

使用可变结构执行此操作时,结构已更改

示例:

>>> tup = (1, 2, 3)
>>> id(tup)
140153476307856
>>> tup += (4, 5)
>>> id(tup)
140153479825840

了解id的变化情况?这意味着它是一个不同的对象。

现在有list,这是可变的:

>>> lst = [1, 2, 3]
>>> id(lst)
140153476247704
>>> lst += [4, 5]
>>> id(lst)
140153476247704

id说的相同。

答案 1 :(得分:5)

+=是否就地修改对象取决于对象。使用元组,您不会修改对象,因为您可以看到是否创建了指向同一对象的另一个变量:

>>> x = (1, 2)
>>> y = x
>>> x += (3, 4)
>>> y
(1, 2)

对于列表等可变对象,您会看到值更改,显示在其所有名称下:

>>> x = [1, 2]
>>> y = x
>>> x += [3, 4]
>>> y
[1, 2, 3, 4]

答案 2 :(得分:2)

您没有修改它,您创建了一个新元组并更改了a变量的内容

尝试a[0] = a[0] + 1查看不变性