2012-03-30 92 views
1

可能重複:
Python list confusionPython的乘法運算

我是新手到Python。請讓我知道爲什麼stairlist [1] [0] =當stairlist = [0,0] * 8

>>> stairlist = [[0,0]] * 8 
>>> stairlist 
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] 
>>> stairlist[1][0] = 2 
>>> stairlist 
[[2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0]] 

初始化2語句將所有數值但是,當我初始化根據stairlist變量以下然後它工作正常。

>>> stairlist = [[1,2],[1,2]] 
>>> stairlist 
[[1, 2], [1, 2]] 
>>> stairlist[1][1] = 3 
>>> stairlist 
[[1, 2], [1, 3]] 
+0

貌似'[[0,0]] * 8'語法使用別名,而不是獨立的副本。不確定這是在規範中還是實施問題。 – jpm 2012-03-30 20:33:20

+0

@FelixKling,不錯的地方。 – jpm 2012-03-30 20:34:42

+0

@jpm:是的,它在規範中。它被稱爲*序列重複*。請參閱http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange note(2),並注意副本被定義爲淺拷貝。 – 2012-03-30 20:39:14

回答

1

array * number將通過在原始數組中創建每個對象的次數副本來創建一個新數組。由於[0,0]本身就是一個數組,因此它是一個合適的對象,新數組只包含一堆對同一個[0,0]數組的引用。當你改變一個,你改變他們所有人。

用於比較:

simplelist = [0] * 8 
[0, 0, 0, 0, 0, 0, 0, 0] 
simplelist[1] = 2 
[0, 2, 0, 0, 0, 0, 0, 0] 
+0

你是什麼意思「因此是一個適當的對象」?一個'int'是一個適當的對象。此外,該類型被稱爲「列表」。因爲對於所有陣列來說這不是真的,所以你需要具體。你的例子試圖展示什麼?你不是他做同樣的事情。如果他要做'旋臂式[1] = 2',他會得到完全相同的行爲。 – agf 2012-03-30 20:44:36