2012-03-28 105 views
11

我是一個新手到Python,但我明白,事情不應該做這種方式,所以請考慮下面的代碼片段作爲純粹的教育:-)列表修改

我目前閱讀「Python入門」,並試圖充分了解下面的例子:

>>> L = [1, 2, 3, 4, 5] 
>>> for x in L: 
... x += 1 
... 
>>> L 
[1, 2, 3, 4, 5] 

,如果這種行爲是有點相關的數字類型的不變性我不明白,所以我已經運行下面的測試:

>>> L = [[1], [2], [3], [4], [5]] 
>>> for x in L: 
... x += ['_'] 
... 
>>> L 
[[1, '_'], [2, '_'], [3, '_'], [4, '_'], [5, '_']] 

問題:是什麼讓列表在第一個代碼中保持不變並在第二個代碼中更改?

我的直覺是,語法是誤導,認爲:

  • x += 1一個整數的真正含義x = x + 1(因此分配一個新的基準)的列表
  • x += ['_']的真正含義x.extend('_')(從而改變列表中)
+7

你的直覺是正確的 – 2012-03-28 12:12:19

+3

爲了完整性,「正確」的方法是'[x + 1 for x in L]' – Kimvais 2012-03-28 12:17:55

+0

@Kimvais:假設你想創建一個新列表。 – MattH 2012-03-28 12:26:20

回答

5

問題:是什麼讓第一個代碼中的列表保持不變並在第二個代碼中發生了變化?

在第一個代碼中,列表是一個(不可變的)整數序列。循環設置x依次引用序列的每個元素。 x += 1x更改爲表示比之前提到的值x多一個的不同整數。原始列表中的元素保持不變。

在第二個代碼中,列表是否包含(可變)列表的序列。循環設置x依次引用序列的每個元素。 x += ['_']由於x涉及一個列表,因此將x所指的列表擴展爲['_']

+0

所以它是真正的解釋它的整數的不變性,謝謝! – icecrime 2012-03-28 12:55:35