官方文檔上給出的一個小例子婚脱,來看一下效果
lists = [[]] * 3
lists #[[], [], []]
lists[0].append(3)
lists #[[3], [3], [3]]
What has happened is that [[]] is a one-element list containing an empty list, so all three elements of [[]]*3are references to this single empty list. Modifying any of the elements of lists modifies this single list.you can create a list like that:
原因在于[[]] 是一個只包含一個空列表的列表,[[]]*3操作使得復(fù)制產(chǎn)生的列表中菲茬,包含了三個指向同一個空列表對象什乙,修改其中任一個列表元素都會對,其他的列表內(nèi)容也會跟著變化祥国,我們可以像下面這樣創(chuàng)建list:
lists1 = [[] for i in range(3)]
lists1 #[[], [], []]
lists1[0].append(2)
lists1 #[[2], [], []]
舉個詳細(xì)的例子
1.第一種形式
row=['_'] * 3
board = []
for i in range(3):
board.append(row)
2.第二種形式
board = []
for i in range(3):
row=['_'] * 3
board.append(row)
3.第三種形式
weird_board = [['_'] * 3] * 3
4.第四種形式
board = [['_'] * 3 for i in range(3)]
首先鸵隧,說一下鹃两,這幾種形式的區(qū)別,然后確定最終最優(yōu)的選擇
第一驶兜,第一種方法和三種方法效果是一樣的扼仲,同樣,第二種方法和第四種方法效果是一樣的抄淑,那么屠凶,第一種和第三種方法有什么問題呢,就是說肆资,在迭代過程中矗愧,它其實是把同一個列表對象引用,放在了同一張列表中三次迅耘,當(dāng)你修改內(nèi)部的列表中某一元素時贱枣,效果就會出現(xiàn)。所以颤专,在具體的使用中纽哥,建議使用第四種方法,這也正是列表推導(dǎo)式常用的地方栖秕,即用于產(chǎn)生新的列表春塌。