41

私はこれを理解しようとしています:

c = 1
def f(n):
    print c + n 
def g(n):
    c = c + n

f(1) # => 2
g(1) # => UnboundLocalError: local variable 'c' referenced before assignment

ありがとう!

4

4 に答える 4

52

関数内では、割り当てられた変数はデフォルトでローカル変数として扱われます。グローバル変数に割り当てるには、次のglobalステートメントを使用します。

def g(n):
    global c
    c = c + n

これは、Python の風変わりな領域の 1 つであり、私にはまったくなじみがありませんでした。

于 2008-09-28T18:02:54.260 に答える
12

グローバル状態は避けるべきものであり、特にそれを変更する必要があります。g()単純に 2 つのパラメーターを取る必要があるかどうかf()、またはインスタンス属性g()を持つ共通クラスのメソッドである必要があるかどうかを検討してくださいc

class A:
    c = 1
    def f(self, n):
        print self.c + n
    def g(self, n):
        self.c += n

a = A()
a.f(1)
a.g(1)
a.f(1)

出力:

2
3
于 2008-09-28T19:33:23.497 に答える
9

Greg の投稿の正誤表:

それらが参照される前に存在しないはずです。見てみましょう:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

参照後に x が割り当てられても、爆発します。Python 変数では、ローカルまたは外部スコープを参照することができ、1 つの関数で変更することはできません。

于 2008-09-29T20:42:21.387 に答える
2

グレッグが言ったこと以外に、Python 3.0 では、「囲んでいるスコープで定義されているいくつかの名前があります」と述べる非ローカル ステートメントがあります。グローバルとは異なり、これらの名前は現在のスコープ外で既に定義されている必要があります。名前と変数を追跡するのは簡単です。今日では、「何かをグローバル化する」が正確に定義されている場所を確認することはできません。

于 2008-09-28T19:39:13.000 に答える