在Python中,如果索引超出范围则跳出while循环

1 投票
1 回答
5637 浏览
提问于 2025-04-17 16:31

我有一个循环,代码大概是这样的:

while a[xp][yp] - a[xp-1][yp] == 0  and a[xp][yp] - a[xp+1][yp] == 0 and a[xp][yp] - a[xp][yp-1] == 0 and a[xp][yp] - a[xp][yp+1] == 0:
    c=randint(0,3)
    if c==0:
        xp=xp+1; yp=yp
    elif c==1:
        xp=xp-1; yp=yp
    elif c==2:
        xp=xp; yp=yp+1
    else:
        xp=xp; yp=yp-1
    xp=xp; yp=yp

问题是,如果xp或yp等于0,或者n(这是数组在x方向或y方向的长度,表示这是一个方阵),那么循环里的条件就会出问题,导致出现越界错误。我希望在xp=0、xp=n、yp=0或yp=n的情况下,能够得到一组新的坐标(我有一段单独的代码来处理这个),然后让循环重新运行。

根据我的观察,这段代码大约每运行四次就有一次能正常工作,不会出现越界错误。我只希望它能一直运行,直到成功为止。

1 个回答

1

你可以简单地检查一下操作是否会让索引超出范围,像这样:

if c==0 and xp < len(a)-1:
  xp += 1
elif c==1 and xp > 0:
  xp -= 1
# etc...

这样可以确保在实际改变 xp 之前,它保持在有效范围内,而不是事后再去检查。


第二个问题出在你的 while 语句上——即使你确保 xpyp 在数组的有效范围内,你在最开始的条件检查时也可能是在检查 超出范围

while a[xp][yp] - a[xp-1][yp] == 0 and a[xp][yp] - a[xp+1][yp] == 0  \ 
  and a[xp][yp] - a[xp][yp-1] == 0 and a[xp][yp] - a[xp][yp+1] == 0:

这里我假设 a 的大小是 10 乘 10(索引从 0 到 9)。如果我们把 xp 设置为 0,yp 设置为 9,那么这将变成:

while a[0][9] - a[-1][9] == 0 and a[0][9] - a[1][9] == 0 \
      a[0][9] - a[0][10] == 0 and a[0][9] - a[0][10]:

a[10] 会抛出超出范围的错误,所以你需要考虑如何在索引正好在数组边界时调整循环。注意 a[9] 仍然是数组的有效索引——问题在于它在检查 下一个 索引。

顺便提一下,a[-1] 不会 抛出异常,尽管这可能是你的逻辑错误——负索引会访问数组中的最后一个元素


有一种可能的解决方法,虽然这取决于你需要做什么:Python 会 短路 or 操作符,所以可以写成这样而不会抛出异常:

while (xp <= len(a)-2 or a[xp][yp]-a[xp+1][yp] == 0) and \
      (xp > 1         or a[xp][yp]-a[xp-1][yp] == 0) and #etc...

在这里,如果 xp 小于 len(a)-2(第一个条件为真),那么 or 语句的另一部分就不会被计算,这样就不会出现超出范围的异常,循环会继续运行(只要 xp 也大于 1,且其他条件也为真)。

撰写回答