Python二维数组赋值异常:为何a与b输出结果不一致?
问题出在二维列表的创建方式!
你遇到的这个坑其实是Python里创建嵌套列表时非常常见的误区,咱们一步步拆解来搞明白:
首先看你初始化a的代码:
a = [[0]*2]*2
这行代码看起来是生成了一个2×2的列表,但实际上它只创建了一个内部列表[0,0],然后把这个列表的引用重复了两次放到外层列表里。换句话说,a[0]和a[1]指向的是同一个列表对象——你可以自己加一行print(a[0] is a[1])验证,输出肯定是True。
接下来看你的赋值循环:
for i in range(2): for j in range(2): a[i][j] = b[i][j]
咱们一步步模拟执行过程:
- 当
i=0, j=0:把b[0][0]的1赋值给a[0][0],因为a[0]和a[1]是同一个列表,此时a直接变成[[1,0], [1,0]] - 当
i=0, j=1:把b[0][1]的1赋值给a[0][1],这时a变成[[1,1], [1,1]] - 当
i=1, j=0:把b[1][0]的1赋值给a[1][0],但这个位置本来就是1,没变化 - 当
i=1, j=1:把b[1][1]的0赋值给a[1][1],因为两个子列表是同一个,所以a[0][1]也会被改成0!最终a就变成了[[1,0], [1,0]]
至于你提到输出里b变成了[[1,0],[1,0]],这大概率是笔误——你的代码里只对a做赋值操作,完全没修改b,正常情况下b应该保持初始的[[1,1],[1,0]]才对。
怎么解决?
要创建真正独立的二维列表,得确保每个内部列表都是全新的对象,推荐用列表推导式:
a = [[0]*2 for _ in range(2)]
或者更直观的写法:
a = [[0 for _ in range(2)] for _ in range(2)]
这样a[0]和a[1]就是两个完全独立的列表,再执行你的赋值循环,a就会和b完全一致了。
内容的提问来源于stack exchange,提问作者Victor. L
相关产品推荐
相关产品推荐

