2013-04-28 17 views
1
>>> a = (1,2) 
>>> a += (3,4) 
>>> a 
(1, 2, 3, 4) 
>>> 

,並用一個列表:如何是一個元組不可改變的,如果你可以添加到它(A + =(3,4))

>>> b = [1,2] 
>>> b += [3,4] 
>>> b 
[1, 2, 3, 4] 
>>> 

作爲一個元組是不可變的和列表是可變的,怎麼樣我們可以解釋行爲嗎?

+0

我覺得'+ ='定義了一個新的元組並返回它(即不會改變現有的元組)。關鍵不在於你所看到的價值觀,而在於底層對象是否相同。通過列表,同一個對象被添加到(不會創建一個新對象)。 – mjgpy3 2013-04-28 04:23:43

+3

數字也是不可變的,但'a = 2; a + = 2'的作品。 – 2013-04-28 04:26:46

+0

@cool_n_curious雖然被警告,但這對元組是一個代價高昂的操作。列表可以簡單地擴展自己,而元組必須在每次執行此操作時構造一個全新的元組,所以只要需要執行此操作就可以使用列表 – jamylak 2013-04-28 04:56:55

回答

2

元組是不可改變的類型,意味着您不能更改存儲在變量a中的值。例如,執行以下操作

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

拋出錯誤TypeError: 'tuple' object does not support item assignment

在另一方面,對於一個列表,

>>> a = [1, 2] 
>>> a[0] = 3 

這是完全有效的,因爲它是可變的。

你正在做的是重新賦值給變量名。

a = a + (3, 4)它只是連接兩個並將其重新分配給變量a。你實際上並沒有改變元組的值。

例如,string是不可改變的,因此,

>>> name = "Foo" 
>>> name[0] ='o' 

如上拋出了一個類似的錯誤。但是,以下是重新分配並且完全有效。

>>> name = name + " Bar" 
>>> name 
'Foo Bar' 

它只是一個串聯。

8

在這個例子中,你並沒有改變實際的元組,你只是改變變量a指向的元組。在此示例中a += (3, 4)a = a + (3, 4)相同。如果我們之前和之後的操作檢查aid,我們可以看到的區別:列表中,從而改變其就地上

>>> a = (1, 2) 
>>> id(a) 
60516360 
>>> a += (3, 4) 
>>> id(a) 
61179528 

隨着名單,+=電話.extend()

>>> b = [1, 2] 
>>> id(b) 
62480328 
>>> b += [3, 4] 
>>> id(b) 
62480328 

注意的bid手術後不會改變。

相關問題