1.问题描述
通过两个乘号构建的二维列表,然后用索引去改变某个位置的值,最后却改变了一列,而直接手打的却可以只改变某一个位置的:
a = [[0]*5]*5
b = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
a[0][2] = 1
b[0][2] = 1
print(a)
print(b)
print(type(a))
print(type(b))
#[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]
#[[0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
#<class 'list'>
#<class 'list'>
2.解决
不能用两个乘号,可以用如下方法:
matrix = [[0]*5 for _ in range(5)]
matrix[0][1] = 1
matrix
#[[0, 1, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0]]
3.原因
不知道两种实现的方式有何区别,为什么会导致这样的结果,可能需要查看源码才能知道原因。