在Python中,如果索引超出范围则跳出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方向的长度,表示这是一个方阵),那么循环里的条件就会出问题,导致出现越界错误。我希望在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
语句上——即使你确保 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
的大小是 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,且其他条件也为真)。