2013-02-14 51 views
0

我有一個包含16個字符的列表。我想用這個列表來填充一個包含4個子列表的新列表。下面是我得到了什麼:爲什麼使用彈出來填充列表改變整個列表?

alist = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', ' ', '1', '2'] 

list4x4 = [[None]*4]*4 

for i in range(4): 
    for j in range(4): 
     list4x4[i][j] = alist.pop(0) 

print list4x4 

這給了我

[['!', ' ', '1', '2'], ['!', ' ', '1', '2'], ['!', ' ', '1', '2'], ['!', ' ', '1', '2']] 

而結果我想是

[['H', 'e', 'l', 'l'], ['o', ',', ' ', 'w'], ['o', 'r', 'l', 'd'], ['!', ' ', '1', '2']] 

有人能解釋這是怎麼回事呢?謝謝

+0

你有4個引用4個引用相同的列表相同的列表。 – geoffspear 2013-02-14 16:39:24

回答

3

你構造列表的方式,你最終與外部列表被填充引用相同的內部列表。例如:

>>> l = [[None]*4]*4 
>>> print [ id(x) for x in l ] 
[39323552, 39323552, 39323552, 39323552] 

所以你可以看到每個內部列表都有相同的ID - 換句話說,它們都是同一個列表。

嘗試:

list4x4 = [[None]*4 for _ in range(4)] 
+2

@Wooble - 不需要內部列表,因爲'None'是不可變的(和單身人士)。 '[None,None,None,None]與'[None] * 4'是一樣的。還要注意,如果你有一個'a = [None,None,None,None]列表,你可以毫無問題地分配給該列表中的一個元素:'a [1] = 3'。 – mgilson 2013-02-14 16:41:55

+0

@Wooble列表理解重新評估該語句,爲每個迭代生成一個新的子列表。 – Keith 2013-02-14 16:43:29

+0

啊,我誤以爲'[None] * 4'就是'[[None],[None],[None],[None]] – geoffspear 2013-02-14 16:44:25