通过两个乘号构建的二维列表,然后用索引去改变某个位置的值,最后却改变了一列,而直接手打的却可以只改变某一个位置的:
- 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'>
不能用两个乘号,可以用如下方法:
- 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]]
不知道两种实现的方式有何区别,为什么会导致这样的结果,可能需要查看源码才能知道原因。