PyScript中二维数组赋值异常:修改单行却改变所有行
问题分析与解决
问题代码
<py-script> rows, cols = (3, 3) board = [[-1]*cols]*rows print(board) board[0][2]=2 print(board) </py-script>
实际输出
[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]] [[-1, -1, 2], [-1, -1, 2], [-1, -1, 2]]
预期输出
[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]] [[-1, -1, 2], [-1, -1, -1], [-1, -1, -1]]
问题原因
这不是PyScript的特有问题,普通Python环境运行这段代码结果完全一致,你之前的测试可能存在误差。
问题出在board = [[-1]*cols]*rows这行代码:
- 首先
[-1]*cols创建了一个包含3个-1的列表; - 然后
*rows是把这个列表的引用复制了3次,也就是说board里的3个元素其实是指向同一个列表的指针。
所以当你修改board[0][2]时,本质是修改了那个被共享的列表,所有行的对应位置自然都会跟着变化。
正确写法
要创建独立的子列表,推荐用列表推导式:
rows, cols = (3, 3) board = [[-1 for _ in range(cols)] for _ in range(rows)] print(board) board[0][2] = 2 print(board)
这样每一行都是新创建的独立列表,修改其中一行不会影响其他行。
也可以用循环逐个创建行:
rows, cols = (3, 3) board = [] for _ in range(rows): board.append([-1]*cols)
内容的提问来源于stack exchange,提问作者AIML23_Kumawat Rahul Devendra
相关产品推荐
相关产品推荐

