2016-08-16 62 views
1

我正在尝试编写一个函数,它可以将1个单位移动到网格左侧(在x轴上)。它只应该在左边有一个有效的坐标时才起作用,如果没有(即起始点在网格的边缘上),则该函数应该返回None。这里是我的尝试:Python - 矩阵IndexError异常不起作用

def left_move(point): 
    try: 
     LEFT = grid[point[1]][point[0]-1] 
    except IndexError: 
     return None 
    if LEFT == '.': 
     change = [-1,0] 
     for idx, amount in enumerate(change): 
      point[idx]+=amount 
     return point 
    return None 

说出发点是[0,3],因此对电网的边缘,我只运行代码的顶部:

def left_move(point): 
    try: 
     LEFT = grid[point[1]][point[0]-1] 
    except IndexError: 
     return None 

它的预期回报None。但是如果整个模块执行完毕,它将返回[-1,3],它位于网格之外,try-except不允许。为什么是这样?如何纠正?

回答

2

这是因为Python的数组索引-1解释是数组的最后一个元素。 -1是引用数组元素的合法方式,因此不会触发IndexError异常。

>>> a = [0,1,2] 
>>> print a[-1] 
2 

您需要手动检查值您将得到解析为-1,然后搞定相应。

2

在这里,您需要将其余的代码放在try语句中。否则,它会尝试,失败,然后运行其余的代码。

def left_move(point): 
    if point[0]-1 != -1: 
     LEFT = grid[point[1]][point[0]-1] 
     if LEFT == '.': 
      change = [-1,0] 
      for idx, amount in enumerate(change): 
       point[idx]+=amount 
      return point 
     return None 
    else: 
     return None 
+0

无论'if'语句是否在'try'块中,代码的结果都是相同的。如果存在异常,那么函数将返回None并且不执行块的其余部分。 – ggordon

+0

ahh yes现在我明白了,您需要参考Jokab的答案,但是它的原因是-1是python中的有效索引。我用一个简单的if语句取代了try/except,它应该做同样的事情。当你只有try/except的代码工作的原因是因为代码完成没有问题,并没有找到一个返回语句,所以简单地返回None默认情况下,或者至少这是我的猜测。 @ggordon – dhdavvie

+0

是用'if'代替'try-except'是个好主意,谢谢! – ggordon