web-dev-qa-db-ja.com

Pythonスコープ: "UnboundLocalError:ローカル変数 'c​​'が割り当て前に参照されました"

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

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

ありがとう!

41
all-too-human

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

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

これは、Pythonの風変わりな領域の1つであり、私にはこれまでうまくいきませんでした。

52
Greg Hewgill

グローバル状態は避けるべきものであり、特にそれを変更する必要があります。 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
12
ironfroggy

グレッグの投稿 の正誤表:

あるべきではない それらが参照される前に。見てください:


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

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

9
Krzysiek Goj

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

2
rhymes