2017-08-15 2 views
-2

Es tut mir wirklich leid, wenn das dumm erscheint. Dieser Code führt zu folgendem Fehler: UnboundLocalError: lokale Variable 'current_order', auf die vor der Zuweisung verwiesen wird, insbesondere in der ersten Zeile der zweiten 'for' -Schleife. Der Fehler ist behoben, wenn ich current_order als globale Variable deklariere; aber ich kann immer noch nicht verstehen, warum ich das tun muss. Habe ich die Variable nicht in der ersten for-Schleife angelegt? (Übrigens ist die Bedingung in der ersten for-Schleife garantiert, True zurückzugeben, so dass das nicht das Problem ist). Vielen DankLokale Variable, auf die vor der Zuweisung innerhalb der Funktion verwiesen wird

def choose_pitch_from_order(current_pitch, direction, pitches_in_play, 
chomp_key): 


    for pitch in all_pitches: 
     if current_pitch == pitch.name: 
      current_order = pitch.order 

    for i in current_order: 
     for pitch in pitches_in_play: 
      if pitch.index == i: 
       next_set = pitch 
       pitches_in_play.remove(next_set) 
       return (next_set, direction, chomp_key) 
+1

Was passiert, wenn 'if current_pitch == pitch.name' niemals zu' True' ausgewertet wird? –

+0

@ JonathonReinhart Er behauptet, dass das nie passieren kann. – Barmar

+1

... oder wenn 'all_pitches' leer ist. –

Antwort

2

Es würde den Zustand in Ihrer ersten Schleife scheint nicht ausgeführt werden, weil current_pitch-pitch.name an irgendeiner Stelle nicht gleich ist, so ist current_order nie zugewiesen. Wenn dies der Fall ist, sollten Sie current_order außerhalb mit einem Standardwert definieren, damit dieser Code nicht fehlschlägt. Denken Sie daran,

def choose_pitch_from_order(current_pitch, direction, pitches_in_play, 
chomp_key): 
    current_order = [] # default value, declaration outside loop/condition 
    ... 

dass der Standardwert eine Art iterable sein muss (list, Tupels, Satz oder jeder anderen iterable), andernfalls wird ein TypeError wird in der zweiten Schleife geworfen werden.

+0

Er schrieb ** By the way, die bedingte in der ersten for-Schleife ist garantiert, True zurückzugeben, so dass das nicht das Problem ist **. Aber ich vermute, du hast Recht, und damit liegt er falsch. – Barmar

+0

@Barmar Einverstanden, es gibt keinen anderen Grund für diesen Fehler, es sei denn, der Code von OP unterscheidet sich von dem hier gezeigten. –

Verwandte Themen