首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果索引超出Python中While循环的界限,则中断循环

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

Stack Overflow用户
提问于 2013-02-21 00:42:07
回答 1查看 4.7K关注 0票数 1

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

代码语言:javascript
复制
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次没有越界运行。我只需要让它一直运行,直到它发生作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-21 01:06:09

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

代码语言:javascript
复制
if c==0 and xp < len(a)-1:
  xp += 1
elif c==1 and xp > 0:
  xp -= 1
# etc...

这将确保xp在实际更改它之前保持在一定的范围内,而不是事后查看它。

第二个问题存在于您的while语句中-即使您确保xpyp在数组的边界内,您也可以在初始条件中检查外部:

代码语言:javascript
复制
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,则结果将为:

代码语言:javascript
复制
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,所以可以在不抛出异常的情况下编写类似的代码:

代码语言:javascript
复制
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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14985218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档