Python-矩阵索引器异常不工作

Python-矩阵索引器异常不工作,python,matrix,indexing,Python,Matrix,Indexing,我正在尝试编写一个函数,该函数允许在网格的x轴上向左移动1个单元。仅当左侧有有效坐标时,该函数才起作用,如果没有,即起点位于网格边缘,则该函数应返回None。以下是我的尝试: def left_move(point): try: LEFT = grid[point[1]][point[0]-1] except IndexError: return None if LEFT == '.': change = [-1,0]

我正在尝试编写一个函数,该函数允许在网格的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不允许使用。为什么会这样?如何纠正呢

这里,您需要将其余代码放在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

在这里,您需要将其余的代码放在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

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

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

您需要手动检查给定的值是否解析为-1,然后进行相应的处理。

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

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

您需要手动检查给定的值是否解析为-1,然后相应地进行处理。

无论if语句是否在try块中,代码都会产生相同的结果。如果出现异常,那么函数将返回None,而不执行块的其余部分。啊,是的,现在我明白了,您需要参考Jokab的答案,但这是因为-1在python中是一个有效的索引。我用一个简单的if语句替换了try/except,它也应该这样做。当您只使用try/except时,代码可以工作的原因是,代码将毫无问题地完成,并且找不到return语句,因此默认情况下只返回None,或者至少这是我的猜测@Ggordonies用if替换try是个好主意,谢谢!无论if语句是否在try块中,代码都会产生相同的结果。如果出现异常,那么函数将返回None,而不执行块的其余部分。啊,是的,现在我明白了,您需要参考Jokab的答案,但这是因为-1在python中是一个有效的索引。我用一个简单的if语句替换了try/except,它也应该这样做。当您只使用try/except时,代码可以工作的原因是,代码将毫无问题地完成,并且找不到return语句,因此默认情况下只返回None,或者至少这是我的猜测@Ggordonies用if替换try是个好主意,谢谢!