我有一个看起来像这样的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次运行一次,而不会超出范围。我只需要它继续运行,直到它发生工作。
答案 0 :(得分:1)
您可以简单地检查操作是否会将索引推出界限,如下所示:
if c==0 and xp < len(a)-1:
xp += 1
elif c==1 and xp > 0:
xp -= 1
# etc...
这将确保xp
在实际更改之前保持在界限中,而不是之后查看它。
第二个问题出在您的while
语句中 - 即使您确保xp
和yp
位于数组的边界内,您也可以检查 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)。