Python螺旋矩阵赋值异常:无法将值正确分配至对应索引
问题根源:列表引用重复陷阱
你遇到的核心问题完全出在结果列表的初始化方式上:
res = [[0]*n]*n
这行代码并没有创建3个独立的子列表,而是先生成一个[0,0,0]列表对象,然后让res里的3个元素全部指向这个同一个列表。所以当你执行res[r][c] = val时,你其实是在修改那个唯一的底层列表,导致所有行看起来同步变化——这就是为什么调试时每次赋值后,所有子列表的对应位置都会跟着改变。
修复方案:创建独立子列表
把列表初始化改成列表推导式的写法,确保每个子列表都是独立的对象:
res = [[0]*n for _ in range(n)]
这个写法会循环n次,每次都生成一个全新的[0]*n列表,这样修改某一行的元素时,不会影响其他行。
修复后的完整代码
n = 3 # 用列表推导式创建独立子列表,避免引用重复 res = [[0]*n for _ in range(n)] def getcoord(r1,c1,r2,c2): for c in range(c1, c2+1): yield r1, c for r in range(r1+1, r2+1): yield r,c2 if r1 < r2 and c1 < c2: for c in range(c2-1, c1-1, -1): yield r2,c for r in range(r2-1, r1, -1): yield r, c1 r1 = 0 r2 = n-1 c1= 0 c2 = n-1 val = 1 while r1<=r2 and c1<=c2: for r,c in getcoord(r1,c1,r2,c2): res[r][c] = val val += 1 r1 += 1; r2 -= 1 c1 += 1; c2 -= 1 # 输出期望的螺旋矩阵 for row in res: print(row)
运行结果
执行后会得到你想要的输出:
[1, 2, 3] [8, 9, 4] [7, 6, 5]
补充说明
你生成坐标和赋值的逻辑都是完全正确的,只是初始化时踩了Python可变对象的引用陷阱。记住:当[x]*n中的x是可变对象(比如列表)时,它会重复引用同一个对象,而不是创建n个独立副本,这是Python新手很容易犯的错误。
内容的提问来源于stack exchange,提问作者crazyy_photonn
相关产品推荐
相关产品推荐

