【问题标题】:Python - Matrix IndexError exception not workingPython - Matrix IndexError 异常不起作用
【发布时间】:2016-08-16 12:37:31
【问题描述】:

我正在尝试编写一个函数,它可以在网格中向左(在 x 轴上)移动 1 个单位。只有当左边有一个有效坐标时它才应该工作,如果没有(即起点在网格的边缘),函数应该返回None。这是我的尝试:

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 所允许。为什么是这样?以及如何纠正?

【问题讨论】:

    标签: python matrix indexing


    【解决方案1】:

    这是因为 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
      

      【讨论】:

      • 无论if 语句是否在try 块内,代码都会产生相同的结果。如果出现异常,则该函数将return None 并且不执行该块的其余部分。
      • 啊是的,现在我明白了,您需要参考 Jokab 的答案,但这是因为 -1 是 python 中的有效索引。我用一个简单的 if 语句替换了 try/except,它也应该这样做。当您只有 try/except 时代码工作的原因是因为代码将毫无问题地完成,并且找不到返回语句,因此默认情况下简单地返回 None,或者至少这是我的猜测。 @ggordon
      • 是的,用if 替换try-except 是个好主意,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2021-04-08
      • 2017-04-05
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多