1

多くの人がこのエラーを受け取るようですが、状況はそれぞれ異なります。

私のコード:

i = 0

def sort(a):

    b = len(a)

    if(i == b):
        print (a)

    elif(b == 0):
        print ('Error. No value detected...')

    elif(b == 1):
        print (a)

    elif(a[i]>a[i+1]):
        a[i], a[i+1] = a[i+1], a[i]

        i = i + 1
        print(a)
        sort(a)

エラーコード:

Traceback (most recent call last):
 File "<string>", line 301, in runcode
 File "<interactive input>", line 1, in <module>
 File "(File location, you don't need to know....)", line 8, in sort
   if(i == b):
 UnboundLocalError: local variable 'i' referenced before assignment

このエラーが何を意味するのか、何が間違っているのかわかりません。

4

4 に答える 4

2

変数iはグローバル (モジュール) レベルで定義されます。スコーピング ルールの簡単な説明を参照してください。 for info は、python が変数を探す順序です。関数内からのみ変数を参照しようとすると、エラーは発生しません。

i = 0

def foo():
    print i

foo()

ローカル変数がないためi、グローバル変数が検索されて使用されます。しかしi、関数に代入すると、ローカル変数が作成されます。

i = 0

def foo():
    i = 1
    print i

foo()
print i

グローバル変数は変更されていないことに注意してください。あなたの場合、行を含めるとi = i + 1、ローカル変数が作成されます。ただし、値が割り当てられる前にこの変数を参照しようとします。これは、取得しているエラーを示しています。

i = 0

def foo():
    print i
    i = 1

foo()

関数内で宣言global iして、Pythonにローカル変数を作成するのではなくグローバル変数を使用するように指示するか、コードを完全に書き直します(あなたが思っているように実行されないため)

于 2013-07-10T01:45:22.573 に答える
1

割り当てているため、変数isort()関数内のローカル変数です。ただし、何かを割り当てる前に使用しようとしているため、このエラーが発生します。

グローバル変数を使用する場合は、関数のどこかにiステートメントを含める必要があります。global i

于 2013-07-10T00:59:57.593 に答える
1

あなたの関数は変数にアクセスできませんii関数内で定義します。また、i = 0のブランチif b==iが必要な場合は、なぜ の別のブランチが必要なのelif b==0ですか? ちょっと興味があるんだけど。

于 2013-07-10T01:01:20.940 に答える
0

実際、このバグの状況はすべて同じです。変数をグローバル コンテキストで定義し、それをローカル コンテキストで参照し、後でそのコンテキストで変更しています。Python は関数を解釈するときに、関数で変更したすべての変数を識別し、それらのローカル バージョンを作成します。i を変更するまで代入しないため、未定義のローカル変数を参照します。

関数内で i を定義するか、 を使用global iして、その名前でグローバル変数に作用することを Python に通知します。

于 2013-07-10T01:06:14.623 に答える