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.原因
不知道两种实现的方式有何区别,为什么会导致这样的结果,可能需要查看源码才能知道原因。
探讨了使用不同方式创建二维列表并修改元素时的差异。演示了为何使用乘法生成的列表在修改时会同时改变一整列,而手动创建的列表则只改变指定元素。通过实例对比,解释了这一现象背后的原因,并提供了解决方案。
1315

被折叠的 条评论
为什么被折叠?



