2016-08-16 2 views
1

Ich versuche, eine Funktion zu schreiben, die eine Bewegung 1 Einheit nach links (in der X-Achse) in einem Raster ermöglicht. Es sollte nur funktionieren, wenn sich links eine gültige Koordinate befindet, und wenn nicht (d. H. Der Startpunkt befindet sich am Rand des Rasters), sollte die Funktion None zurückgeben. Hier ist mein Versuch:Python - Matrix IndexError Ausnahme funktioniert nicht

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 

Sagen Sie der Ausgangspunkt [0,3] ist und deshalb am Rand des Gitters und ich nur den oberen Teil des Codes auszuführen:

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

Es gibt None wie erwartet. Wenn der gesamte Block jedoch ausgeführt wird, gibt er [-1,3] zurück, das sich außerhalb des Rasters befindet und nicht von try-except zugelassen werden sollte. Warum ist das? Und wie kann es korrigiert werden?

Antwort

2

Dies liegt daran, Python Interpretation von -1 in Array Indexierungs das letzte Element des Arrays ist. -1 ist eine legale Art der Referenzierung von Array-Elementen und löst daher keine IndexError Ausnahme aus.

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

Sie müssten manuell überprüfen, ob der Wert, den Sie Entschlüssen zu -1 gegeben und dann das entsprechend zu behandeln.

2

Hier müssen Sie den Rest des Codes in die try-Anweisung einfügen. Andernfalls wird es versuchen, fehlschlagen und dann den Rest des Codes ausführen.

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

Der Code liefert das gleiche Ergebnis, egal ob die 'if' Anweisung innerhalb des' try' Blocks ist oder nicht. Wenn es eine Ausnahme gibt, wird die Funktion keine NULL zurückgeben und den Rest des Blocks nicht ausführen. – ggordon

+0

ahh ja jetzt ich sehe, Sie müssen auf Jokab's Antwort beziehen, aber es ist, weil -1 ein gültiger Index in Python ist. Ich habe das try/except durch eine einfache if-Anweisung ersetzt, es sollte dasselbe tun. Der Grund, warum der Code funktionierte, wenn Sie nur den Befehl try/except hatten, war der, dass der Code ohne Probleme endete und keine return-Anweisung gefunden wurde. Daher wurde einfach per Default keine zurückgegeben, oder zumindest denke ich. @ggordon – dhdavvie

+0

Ja Ersetzen der 'try-except' mit' if' ist eine gute Idee, danke! – ggordon