2013-12-14 50 views
5

我发现了一些问题询问TypeError: 'tuple' object does not support item assignment对SO,但尽管如此,我很困惑这个问题:python元组,有人可以解释这种行为吗?

考虑代码片段:

>>> a = ([],[]) 
>>> a[0].append(1)  # 1 
>>> a 
([1], []) 
>>> a[0] += [2] 

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    a[0] += [2] 
TypeError: 'tuple' object does not support item assignment # 2 
>>> a 
([1, 2], []) # 3 
>>> 

我的问题是:

  1. 元组是为什么?(我知道我真的不明白python的不变性..)
  2. 如果1是可以接受的d,2提高TypeError的原因是什么?
  3. 3,a被修改,那么提高TypeError有什么意义?

谢谢

+0

对于第一个,请参阅http://docs.python.org/3/reference/datamodel.html#objects-values-and-types-基本上,“元组是不可变的”只意味着“你不能添加,删除或者替换元组中的对象“,而不是”包含在元组中的对象也是不可变的“。 – delnan

回答

0

这是因为元组是不可变的,但它可以包含可变数据类型(一列表在乌拉圭回合的情况下)为元素。您的元组a = ([], [])是列表的元组。所以这就是为什么你能够将数据附加到[0] - 这是一个列表。

在此:

a[0] += 2 

您试图改变这引发异常类型错误(由于使用“=”赋值运算符)

三元组的值,列表由于使用'+'运算符而被连接起来。

+0

-1你的答案没有解决'a [0] + = 2'如何尝试修改元组,因为天真地,我期望只修改列表对象。 'a [0]'与'a'不同。 –

+0

a [0] = a [0] + [2],这里右侧完成时没有错误(连接发生),并且当试图将结果赋值给[0]时,实际上是为元组赋值,所以这是一个错误。我可能错了。但这就是我所理解的。 – Praveen

相关问题