You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:16:48