2016-08-16 5 views
1

グリッド内の1つの単位を左(x軸)に移動する機能を記述しようとしています。有効な座標が左側にある場合のみ機能し、そうでない場合(つまり、開始点がグリッドの端にある場合)、関数はNoneを返す必要があります。 Python - Matrix IndexError exception not working

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

配列のインデックスで-1のPythonの解釈は、配列の最後の要素であるためです。 -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 None'を返し、残りのブロックは実行しません。 – ggordon

+0

ahhはい今私はJokabの答えを参照する必要がありますが、-1はPythonの有効なインデックスだからです。私はtry/exceptを単純なif文で置き換えました。同じことをする必要があります。コードが問題なく終了し、return文が見つからないので、try/exceptのみがあったときにコードが動作した理由は、デフォルトではNoneを返すか、少なくとも私の推測であるからです。 @ggordon – dhdavvie

+0

はい、 'try-except'を' if'に置き換えるのは良いアイデアです、ありがとう! – ggordon