2017-08-15 7 views
-2

これがばかげていると本当に残念です。このコードの結果、UnboundLocalError:代入前、特に2番目の 'for'ループの最初の行に、ローカル変数 'c​​urrent_order'が参照されます。 current_orderをグローバル変数として宣言すると、エラーは修正されます。しかし、私はなぜこれをやらなければならないのかまだ分かりません。最初のforループで変数を作成していませんか? (ところで、最初のforループの条件式はTrueを返すことが保証されているので問題ありません)。 current_pitchは、いずれかの時点でpitch.nameと等しくないので、current_orderが割り当てられることはありませんので 感謝関数内での代入前に参照されるローカル変数

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

'current_pitch == pitch.name'が' True'に評価されない場合はどうなりますか? –

+0

@JonathonReinhart彼はそれは決して起こり得ないと主張する。 – Barmar

+1

...または 'all_pitches'が空である場合。 –

答えて

2

あなたの最初のループ内の条件が実行されないと思われます。この場合、current_orderをデフォルト値で外側に定義して、このコードが失敗しないようにする必要があります。

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

デフォルト値はそうTypeErrorは、第二のループにスローされます反復可能なのいくつかの並べ替え(リスト、タプル、セット、またはその他の反復可能)、でなければならないことに注意してください。

+0

彼は書きました**ところで、最初のforループの条件式はTrueを返すことが保証されているので問題はありません**。しかし、私はあなたが正しいと思うし、彼はそれについて間違っています。 – Barmar

+0

@Barmar OPのコードがここに示されているコードと異なる場合を除き、このエラーの原因は他にありません。 –

関連する問題