Traceback (most recent call last):IndexError: list assignment index out of range

今天在写n-皇后python代码时,遇到了这个报错:Traceback (most recent call last):IndexError: list assignment index out of range。

先上结论,trackback其实是一个异常追踪栈,所以应该看最后一个抛出异常的位置,也就是报错信息最后一行。在我这里定位到是  g[x][y]='.'列表越界

代码如下:

N=100
n=int(input())
g=[[0]*n for _ in range(n)]
row,col,dg,udg=[0]*N,[0]*N,[0]*2*N,[0]*2*N

def dfs(x,y,s):
#处理每行遍历完之后的越界问题
    if(y>n):
        y=0
        x=x+1    
    if(x==n):
        if(s==n):
            for i in range(n):
                    print("".join(g[i]))
            print("")
        return
#不放
    g[x][y]='.'
    dfs(x,y+1,s)
#放
    if (not row[x]) and (not col[y]) and (not dg[x+y]) and (not ugd[y-x+n]):
        g[x][y]='Q'
        row[x]=1
        col[y]=1
        dg[x+y]=1
        udg[y-x+n]=1
        dfs(x,y+1,s+1)
        g[x][y]='.'
        row[x]=0
        col[y]=0
        dg[x+y]=0
        udg[y-x+n]=0
dfs(0,0,0)

报错如图:

Traceback异常追踪栈, 第一层try catch,如果异常没有被处理,则会跑出去给函数调用者。如果下一层还是没被处理,则继续抛出去。如果抛到最后一层都还是没被处理,那就只能终止程序了,并且打印异常信息,即上述截图的打印过程。

具体的找错误的过程,我们可以通过自己打印异常信息来帮助寻找。既然已经找到了抛出异常的位置,我们可以接住异常,看看是怎么个越界发法。

#不放
    try:
        g[x][y]='.'
    except IndexError as e:
        raise ValueError("异常信息{},x:{},y:{}".format(str(e),x,y))

 x=0,y=4的时候发生了越界。定位到了原因,我这里下标是从0开始的,按理说y=n-1的时候就应该结束,所以错误代码在这里:

    if(y>n):
        y=0
        x=x+1   
应该改为
    if(y>=n):
        y=0
        x=x+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值