《流暢的python》:由*初始化一個由列表組成的列表
阿新 • • 發佈:2020-10-27
有時候我們需要初始化一個巢狀著幾個列表的列表,這種情況下推薦使用列表推導式
程式碼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()