2013-12-14 52 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

相關問題