3 回答

TA貢獻1802條經驗 獲得超4個贊
因為實際上只有一個列表??紤]一下:
>>> l = [[]]
>>> l2 = l*2
>>> l2[0] is l[0]
True
>>> l2[1] is l[0]
True
*2對列表執行的操作不會復制該列表,但會返回一個長度2相同的列表,并用相同的引用填充。
您可能想要的是:
>>> l = [[] for _ in xrange(2)]
正如@Asterisk在評論中提到的那樣,所有常見集合都暴露出相同的行為。因此,根據經驗,最好只對具有值語義的不可變類型使用乘法。

TA貢獻1825條經驗 獲得超6個贊
這是我初始化列表列表的方式。行的變化最慢。
nrows = 3; ncols = 5
l_of_ls = [[0]*ncols for i in range(nrows )]
for rix, r in enumerate(l_of_ls):
for cix, c in enumerate(r):
print rix, cix, 'val = ',c
結果
0 0 val = 0
0 1 val = 0
0 2 val = 0
0 3 val = 0
0 4 val = 0
1 0 val = 0
1 1 val = 0
1 2 val = 0
1 3 val = 0
1 4 val = 0
2 0 val = 0
2 1 val = 0
2 2 val = 0
2 3 val = 0
2 4 val = 0
還值得注意的是用于索引目的
for rix in range(nrows):
for cix in range(ncols):
print l_of_ls[rix][cix],
結果
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
添加回答
舉報