1. 程式人生 > 實用技巧 >《流暢的python》:由*初始化一個由列表組成的列表

《流暢的python》:由*初始化一個由列表組成的列表

有時候我們需要初始化一個巢狀著幾個列表的列表,這種情況下推薦使用列表推導式

程式碼1:


def test01():
l = [["_"] * 3 for i in range(3)]
print(l)
l[1][2] = "x"
print(l)
if __name__ == '__main__': test01()

執行結果

[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
[['_', '_', '_'], ['_', '_', 'x'], ['_', '_', '_']]

程式碼2:這種看著便捷,但實際上是錯誤的方式,外層列表裡面實際上存的是3個指向同一個引用的列表,修改任一一個則全都被修改

def test02():
    l = [["_"]*3]*3
    print(l)
    l[1][2] = "x"
    print(l)

if __name__ == '__main__':
    test02()

執行結果
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
[['_', '_', 'x'], ['_', '_', 'x'], ['_', '_', 'x']]

上面兩種程式碼的等價效果:

程式碼一相當於:
def test_11():
    l = []
    for i in range(3):
        row 
= ["_"]*3 l.append(row) print(l) l[1][2] = "x" print(l) if __name__ == '__main__': test_11() 程式碼二相當於: def test_22(): l = [] row = ["_"] * 3 for i in range(3): l.append(row) print(l) l[1][2] = "x" print(l) if __name__ == '__main__': test_22()