私はこれを理解しようとしています:
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
ありがとう!
関数内では、割り当てられた変数はデフォルトでローカル変数として扱われます。グローバル変数に割り当てるには、次のglobal
ステートメントを使用します。
def g(n):
global c
c = c + n
これは、Python の風変わりな領域の 1 つであり、私にはまったくなじみがありませんでした。
グローバル状態は避けるべきものであり、特にそれを変更する必要があります。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
Greg の投稿の正誤表:
それらが参照される前に存在しないはずです。見てみましょう:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
参照後に x が割り当てられても、爆発します。Python 変数では、ローカルまたは外部スコープを参照することができ、1 つの関数で変更することはできません。
グレッグが言ったこと以外に、Python 3.0 では、「囲んでいるスコープで定義されているいくつかの名前があります」と述べる非ローカル ステートメントがあります。グローバルとは異なり、これらの名前は現在のスコープ外で既に定義されている必要があります。名前と変数を追跡するのは簡単です。今日では、「何かをグローバル化する」が正確に定義されている場所を確認することはできません。