Python3中遍历二维数组前n个元素结果异常的原因排查
为什么二维数组遍历填充后结果不符合预期?
嘿,这个坑我刚学Python的时候也踩过!核心问题出在你初始化二维数组的方式上——你大概率用了共享引用的错误写法,导致所有子列表其实是同一个对象的副本,修改一个就会影响全部。
先还原你可能的错误操作
假设你是这么初始化数组的:
rows = 3 cols = 2 # 错误的初始化方式 a = [[0] * cols] * rows print(a) # 输出 [[0, 0], [0, 0], [0, 0]],看起来完全正常
然后你尝试遍历前len(a)个元素(比如前2行)填充:
for i in range(2): a[i][0] = i print(a) # 你预期得到 [[0,0], [1,0], [0,0]],但实际结果是 [[1,0], [1,0], [1,0]]
问题根源:列表的引用复制
[[0]*cols]*rows这个写法,并没有创建rows个独立的子列表,而是把同一个[0]*cols列表对象的引用复制了rows次,放到外层列表里。也就是说,a[0]、a[1]、a[2]其实指向内存里的同一个列表。
所以当你修改a[0][0]时,本质是在修改那个共享的子列表,自然所有行的对应位置都会跟着变——因为它们本来就是同一个东西。
正确的初始化方式
要让每个子列表都是独立的对象,用列表推导式就行:
# 方式1:最清晰的写法 a = [[0 for _ in range(cols)] for _ in range(rows)] # 方式2:简化版,效果一样 a = [[0]*cols for _ in range(rows)]
外层的for循环会每次生成一个新的[0]*cols列表,每个子列表都是独立的内存对象,修改其中一个不会影响其他。
再跑一遍填充代码:
for i in range(2): a[i][0] = i print(a) # 输出 [[0,0], [1,0], [0,0]],完全符合你的预期
总结一下
- 避坑点:别用
[x]*n的嵌套写法初始化二维数组,会导致子列表共享引用 - 正确姿势:用列表推导式,确保每个子列表都是单独创建的
内容的提问来源于stack exchange,提问作者JustABeginner
相关产品推荐
相关产品推荐

