在Python中,元组是不可变的对象,但允许对包含的列表进行变异?

在Python中,元组是不可变的对象,但允许对包含的列表进行变异?,python,Python,在Python中: >>> tup = (1,"a",[1,2,3]) >>> tup (1, 'a', [1, 2, 3]) >>> tup[2][1] = "a" >>> tup (1, 'a', [1, 'a', 3]) 从上面我可以修改作为元组一部分的列表内容。既然元组是不可变的,这怎么可能呢? 我对不可变部分的理解有误吗?元组容器是不可变的,但其中的元素可能是不可变的,也可能不是不可变的 示例中的元组确实是不可变

在Python中:

>>> tup = (1,"a",[1,2,3])
>>> tup
(1, 'a', [1, 2, 3])
>>> tup[2][1] = "a"
>>> tup
(1, 'a', [1, 'a', 3])
从上面我可以修改作为元组一部分的列表内容。既然元组是不可变的,这怎么可能呢?
我对不可变部分的理解有误吗?

元组容器是不可变的,但其中的元素可能是不可变的,也可能不是不可变的

示例中的元组确实是不可变的,但它包含对可变列表的引用

那么最终我可以修改元组内容了吗

不,不能使元组指向其他列表,但可以更改列表中的内容

当您执行
tup[2][1]=“a”
时,您没有对元组进行变异,而是对列表进行了变异。元组仍然具有与以前相同的对列表的引用

查看引用未更改的代码片段:

我们可以使用,它返回对象的标识(在CPython中,它返回内存中对象的地址)


你对不可变部分的理解是错误的。元组确实是不可变的,因为您无法更改其列表:

In [3]: tup[2] = []
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-02255d491606> in <module>()
----> 1 tup[2] = []

TypeError: 'tuple' object does not support item assignment
[3]中的
:tup[2]=[]
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1元组[2]=[]
TypeError:“tuple”对象不支持项分配
列表的引用在该元组中是不可变的。但是,列表本身是可变的,因此可以修改,正如您已经知道的那样

换句话说,元组是不可变的,它包含三个元素:

  • 整数1
  • 字符串“a”
  • 对列表的引用

如果你知道C,你可以把它想象成列表的地址。如果你对内存一无所知,你可以把它看作“元组知道在哪里找到列表”。但是它并不包含列表本身。

元组是不可变的——它将始终包含相同的对象。如果这些对象是可变的,它们本身可能会发生变异,但元组仍将包含该对象

因为
列表
总是可变的。您没有变异元组。第三个元素仍然包含对同一列表的引用。列表已更改,从技术上讲,元组未更改。请在修改包含的列表之前和之后比较
[id(x)for x in tup]
。不可变意味着无法修改内容,对吗?但在这里,我可以使用可变容器修改元组的内容,所以最后我可以修改元组的内容?好的,我知道C,我现在明白了元组存储了对列表的引用(不是我之前理解的实际值),不能修改,但是一旦你选择了引用(列表),列表值可以修改,谢谢。
In [3]: tup[2] = []
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-02255d491606> in <module>()
----> 1 tup[2] = []

TypeError: 'tuple' object does not support item assignment