2017-03-03 10 views
2

以下のコードをリストの理解に使用しています。UnboundLocalError:代入前にローカル変数 'y'が参照されています

x = 2 
y = 3 

[x*y for x in range(x) for y in range(y)] 

これは、コードの作品の下に、しかしエラー

Traceback (most recent call last): 
    File "<pyshell#35>", line 1, in <module> 
    [x*y for x in range(x) for y in range(y)] 
    File "<pyshell#35>", line 1, in <listcomp> 
    [x*y for x in range(x) for y in range(y)] 
UnboundLocalError: local variable 'y' referenced before assignment 

の下に私を与えています。

[x*y for x in range(x)] 
[0, 5] 

リスト内の2番目のforループの有効範囲規則はありますか?

私はPython 3.6を使用しています。

+0

@Chris_Rands:重複する可能性のある投稿は、UnboundLocalErrorとリストの理解のためのスコープルールについては言及していません。 –

答えて

1

良いコードですが、このコードはPython2.xでうまく動作し、UnboundLocalErrorPython3.xに送ります。

It can be a surprise to get the UnboundLocalError in previously working code when it is modified by adding an assignment statement somewhere in the body of a function.

あなたはスコープ内の変数への代入を行うとき、その変数はそのスコープにローカルなり、外側のスコープのいずれかの似た名前の変数をシャドウするためです。 xに新しい値を代入するので、コンパイラはそれをローカル変数のと認識します。したがって、初期の変数は初期化されていないローカル変数を出力しようとし、エラーが発生します。

詳細はWhy am I getting an UnboundLocalError when the variable has a value?を参照してください。

+0

これは、forループがリスト内包のローカルスコープを持っていることを意味しますか?私の理解によれば、ループはモジュールレベルで作成されたときにローカルスコープを作成しません。 –

関連する問題