これを理解する秘訣は、=を使用して変数に割り当てるときに、ローカル変数としても宣言することです。したがって、グローバル変数aの値を変更する代わりに、setA(value)は実際にローカル変数(たまたまaと呼ばれる)を渡された値に設定します。
これは、次のようにsetA(value)の先頭にaの値を出力しようとするとより明白になります。
def setA(value):
print "Before assignment, a is %d" % (a)
a = value
print "Inside setA, a is now %d" % (a)
このPythonを実行しようとすると、役立つエラーが発生します。
トレースバック(最後の最後の呼び出し):
ファイル"scopeTest.py"、行14、
setA(42)
setAのファイル「scopeTest.py」、7行目
print "割り当て前、aは%d"%(a)
UnboundLocalError:割り当て前に参照されるローカル変数'a'
これは、PythonがsetA(value)関数にaと呼ばれるローカル変数があると判断したことを示しています。これは、関数で割り当てるときに変更するものです。(printA()のように)関数内でaに割り当てない場合、Pythonはグローバル変数Aを使用します。
変数をグローバルとしてマークするには、グローバル変数を使用するスコープで、 Pythonのglobalキーワードを使用する必要があります。この場合、それはsetA(value)関数内にあります。したがって、スクリプトは次のようになります。
a = 7
def printA():
print "Value of a is %d" % (a)
def setA(value):
global a
a = value
print "Inside setA, a is now %d" %(a)
print "Before setA"
printA()
setA(42)
print "After setA"
printA()
この1行の追加は、setA(value)関数で変数aを使用すると、ローカル変数ではなくグローバル変数について話していることをPythonに通知します。