2014-10-19 104 views
4

我读过Python元组创建后无法修改。例如,元组对象不允许使用项目分配。但是,如果我有一个元组内的列表对象,那么我可以追加到列表中。那么,不应该Python不允许这样做,因为我们基本上修改了一个元组?修改元组中的列表

+1

我的猜测是,元组仅持有到列表的引用。所以你可以修改引用的内容,而不是引用本身。 – grc 2014-10-19 02:08:14

+2

在这里看到详细的答案:https://stackoverflow.com/questions/9755990/why-can-tuples-contain-mutable-items – Totem 2014-10-19 02:08:55

回答

2

从python的documentation

包含对可变对象的参考时,后者的值被改变可以改变不可变容器对象的数值;然而容器仍然被认为是不可变的,因为它包含的对象的集合是不能改变的。因此,不变性与具有不变的价值不完全相同,它更加微妙。

在某些方面这意味着元组内的对象仍然有同样身份id

>>> t 
([0],) 
>>> id(t[0]) 
140282665826440 
>>> t[0].append(1) 
>>> t 
([0, 1],) 
>>> id(t[0]) 
140282665826440 # same as in above 
1

元组的不变性很浅:您无法更改元组引用的对象。但是如果这些对象本身是可变的,你可以改变它们。