2016-08-16 114 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