如果索引超出Python中While循环的界限,则中断循环

时间:2013-02-20 16:42:07

标签: python arrays matrix while-loop indexoutofboundsexception

我有一个看起来像这样的while循环:

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方向上的长度,它是一个方阵),那么while循环中的条件会崩溃并且我得到一个边界错误。我只想得到一组新坐标,如果xp = 0或xp = n或yp = 0或yp = n(我有一段单独的代码可以执行此操作)并让while循环再次运行。

代码的本质似乎是代码运行时每4次运行一次,而不会超出范围。我只需要它继续运行,直到它发生工作。

1 个答案:

答案 0 :(得分:1)

您可以简单地检查操作是否会将索引推出界限,如下所示:

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

这将确保xp在实际更改之前保持在界限中,而不是之后查看它。


第二个问题出在您的while语句中 - 即使您确保xpyp位于数组的边界内,您也可以检查 outside < / em>在你的初始条件:

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]仍然是数组的有效索引 - 它正在检查 next 索引是否存在问题。

顺便说一句,a[-1] 实际上不会抛出异常,尽管这可能是您的逻辑错误 - the negative index will access the final element in the array


一种可能的解决方法,虽然它取决于你需要做什么:Python会short-circuit the or operator,所以可以写这样的东西而不抛出异常:

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 less 而不是len(a)-2(第一个子句的计算结果为true),or语句的另一半将不会在评估时,不会发生越界异常,并且循环将继续运行(只要xp也大于1,并且该语句的其余部分也计算为true)。