2011-03-29 55 views
0

所有,如何正確使用b = [[1] * 3] * 3?

代碼:

#=A=================== 
>>> b = [[1]*3]*3 
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0     
>>> b 
[[0, 1, 1], [0, 1, 1], [0, 1, 1]] 
>>> 
#=B=================== 
>>> b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0 
>>> b 
[[0, 1, 1], [1, 1, 1], [1, 1, 1]] 
  1. 我可以使用格式可能看起來像「B = [[1] * 3 * 3」,以獲得相同的行爲「b = [[1,1,1],[1,1,1],[1,1,1]]」減少鍵入?

  2. as 「b = [[1] * 3] * 3」可能會返回一個「參考」的列表,對日常工作有用嗎?任何樣品?

謝謝! KC

+0

列表我不想聽起來刺耳,但你的問題讓我很頭疼:D請你重新說明一下嗎? – Spyros 2011-03-29 01:32:08

+0

這兩個表達式完成不同的事情。顯然,你不能像你的例子那樣使用'b = [[1] * 3] * 3'。既然你已經給出了一個很好的證明它不起作用,你的問題是什麼? – 2011-03-29 01:32:24

+0

@ S.Lott,這個問題來自web上的閱讀帖子,當我閱讀代碼「b = [[1] * 3] * 3」時,我認爲這個表達式清晰直接,可以減少鍵入,但我是肯定它不能工作,是的,我知道它是一個「參考」列表,所以我認爲有可能對它進行細化並且與「b = [[1,1,1],[1,1, 1],[1,1,1]]「以減少輸入類型,並且由於」b = [[1] * 3] * 3「可能導致作爲」參考「列表,對日常工作有用嗎? – user478514 2011-03-29 05:16:12

回答

1

與您的代碼的問題是,它引用相同的列表,所以當你b[0][0] = 0,你真的更新在引用(在所有三個陣列指向)的值。

爲了得到想要的結果,我會(使用list comprehension)做:

>>> b = [[1]*3 for _ in range(3)] 
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] 
>>> b[0][0] = 0 
>>> b 
[[0, 1, 1], [1, 1, 1], [1, 1, 1]] 

實際上再現列表,以便它引用不同的列表,而不是同一個在你的答案。

b = [[1]*3 for _ in range(3)]等同於:

b = [] 
for _ in range(3): 
    b.append([1]*3) 
1

你可以用一個列表理解,而不是建立您的清單:

b = [[1]*3 for _ in range(3)] 
1

您的問題是[[1, 1, 1]] * 3創建的三個引用列表,以相同[1, 1, 1]列表。做你想做什麼,你要創建的副本[1,1,1]採用list()或使用切片表示法:

first_list = [1, 1, 1] 
second_list = [first_list[:], first_list[:], first_list[:]] 

second_list = [list(first_list), list(first_list), list(first_list)] 

要做到以上在同一行,你可以這樣做:

second_list = [[1] * 3 for i in range(3)] 
0

在A節: 你有3個項目,但所有項目指向一個對象的列表:

[1] * 3

這樣的:

a = [1,1,1] 
b = [a,a,a] 

但在部分B,你有不同的項目

相關問題