2

私はこのコードを持っています:

def r():
    i += 1
    return i

def f():
    return x*a

i = 0

a=2 
x=3

print f()
print r()

ではこのエラーが発生しますがr()、では発生しませんf():

~$ python ~/dev/python/inf1100/test.py 
6
Traceback (most recent call last):
  File "/home/marius/dev/python/inf1100/test.py", line 18, in <module>
    print r()
  File "/home/marius/dev/python/inf1100/test.py", line 2, in r
    i += 1
UnboundLocalError: local variable 'i' referenced before assignment

f()関数の外で定義された変数を使用できるのに、使用r()できないのはなぜですか?

4

5 に答える 5

5

これは、グローバル変数をr 再割り当てiするためです。 f一方、それを使用するだけです。i += 1と同じであることを覚えておいてくださいi = i + 1

特に明示的に指示しない限り、Python は関数内で使用されるすべての変数をローカル変数として扱います。さらに、iのローカル スコープ内に変数が定義されていないrため、エラーがスローされます。

関数内でグローバル変数を再割り当てする場合は、次のようにする必要があります。

global var

関数の先頭で、グローバルであることを明示的に宣言varします。

したがって、r機能させるには、次のように書き直す必要があります。

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:18:14.687 に答える
4

ほとんどの場合、これを指摘したいと思います。

x = 1

def f():
    global x
    x += 1

f()

は悪い習慣であり、代わりにパラメーターを使用する必要があります。

x = 1

def f(a_number):
    return a_number + 1

x = f(x)

ここもまた:

def r():
    global i
    i += 1
    return i

return iが冗長な場合、変数は関数の呼び出しによって増加します。

Python FAQ のこの部分も関連性があり、役に立ちます。

于 2013-10-08T15:27:18.327 に答える
3

この作品:

def r():
    i += 1
    return i

グローバル変数を使用するだけでなく、それらを変更しようとします (より正確には、グローバル変数に別の値を割り当てますi)。

機能させるには、この変数をグローバルとして宣言するだけです。

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:18:34.217 に答える
1

rあなたはあなたのグローバルをシャドーイングしていますi。追加しようとする前に割り当てられていないため、エラーが発生します。

可能な解決策は、そのような関数で使用するglobal iことrです

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:19:47.673 に答える
0

変数に代入すると、Python はその変数をローカルと見なし、同じ名前のグローバル変数を探す必要はありません。global他の回答で提案されているように使用してください。

于 2013-10-08T15:21:39.323 に答える