我有一个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循环中的条件就会失效,我会得到一个越界错误。
代码的本质似乎是每4次代码中就有1次没有越界运行。我只需要让它一直运行,直到它发生作用。
发布于 2013-02-21 01:06:09
您可以简单地检查该操作是否会将索引推出边界,如下所示:
if c==0 and xp < len(a)-1:
xp += 1
elif c==1 and xp > 0:
xp -= 1
# etc...这将确保xp在实际更改它之前保持在一定的范围内,而不是事后查看它。
第二个问题存在于您的while语句中-即使您确保xp和yp在数组的边界内,您也可以在初始条件中检查外部:
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的大小是10x10(索引从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]实际上不会抛出异常,尽管它很可能是一个逻辑错误-- 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小于len(a)-2 (第一个子句的计算结果为true),则不会计算or语句的另一半,不会发生越界异常,循环将继续运行(只要xp也大于1,并且语句的其余部分也计算为true)。
https://stackoverflow.com/questions/14985218
复制相似问题