2014-01-15 485 views
4

我正在使用Python2.7。*,並且當列表是元組的元素時嘗試列表操作的測試。
但我發現的東西,我不能讓自己明白:Python:當列表是元組中元素時的列表操作

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

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

>>> c = ([],) 
>>> c[0].extend([1,2,3]) 
>>> 
>>> c 
([1, 2, 3],) 

我知道,元組是不可變的和列表是可變的,我知道list +=相當於list.extend()List += Tuple vs List = List + Tuple
但是現在我在海上該如何解釋上面的代碼。

回答

7

在這段代碼中,你是分配給第一個元素,這在元組中是不可能的。

>>> a = ([],) 
>>> a[0] = a[0] + [1,2,3] 

在這裏,右手邊是創建從a[0]+[1,2,3]一個新的列表,然後試圖將其分配回a[0]這是不合法的。

在這段代碼中,您正在檢索元組的第一個元素,然後對其進行操作。

>>> c = ([],) 
>>> c[0].extend([1,2,3]) 

當然,它的一個小的語義差別,但它是在你第一次嘗試在一個元組重新分配的元素。但讓我們看看在幕後發生了什麼:

這裏我們分配一個列表到x並觀察它的id如何通過不同的操作改變。

>>> x=[] 
>>> id(x) 
139987361764560 
>>> id([]) 
139987361677112 
>>> id(x+[1]) 
139987361829736 
>>> x.append(1) 
>>> x 
[1] 
>>> id(x) 
139987361764560 

注意,對於[]xx+[1]的ID都不同,但x ID之後,我們追加一個1仍然是相同的。這再次強化了上面的陳述,即聲明a[0] = a[0] + [1,2,3]正在創建一個新列表,然後嘗試將其分配到元組中。

但我們的元組的是什麼,以及讓做一些ID再次檢查:

>>> id(y) 
139987361830168 
>>> id(y[0]) 
139987361677112 
>>> id(y[1]) 
139987361723384 
>>> y[1] = y[1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 
>>> y[1].append(1) 
>>> id(y[1]) 
139987361723384 
>>> y 
([], [1]) 

同樣,我們創建了一個元組,並且可以看出,元組y和它的每個元素具有不同的ID。但是請注意,我們甚至無法將同一個列表重新分配到元組中的同一個位置。但是,我們可以按照預期在該列表上執行操作,並查看元組更改。

關於不變性:這裏要注意的重要一點是,元組不會改變,因爲元組中的對象的ID不更改。

+0

+1好答案,我不知道我怎麼沒想到這件事。 – Christian

+1

非常感謝,這是一個很好的答案。 「元組不變,因爲元組內的對象的id不會改變」這句話使得所有的都清楚了! – nevesly

相關問題