グローバル変数への代入がPythonで機能しないのはなぜですか?python


Answers

これを理解するためのトリックは、変数に代入するときに=を使うと、それをローカル変数として宣言するということです。 したがって、グローバル変数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を実行しようとすると、役に立つエラーが発生します:

Traceback (most recent call last):
  File "scopeTest.py", line 14, in 
    setA(42)
  File "scopeTest.py", line 7, in setA
    print "Before assignment, a is %d" % (a)
UnboundLocalError: local variable 'a' referenced before assignment

これは、PythonがsetA(value)関数にaというローカル変数を持つことを決定したことを示しています。これは関数内で代入するときに変更するものです。 関数内で(printA()と同様に)代入しないと、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行の追加は、Pythonに、ローカル変数ではなくグローバル変数について話しているsetA(value)関数で変数aを使用するときに通知します。

Question

私はPythonのスコープ規則を理解しようとするとひどい問題を抱えています。

次のスクリプトを使用します。

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

予期せぬ(私に)次のような結果をもたらします。

    Before setA
    Value of a is 7
    Inside setA, a is now 42
    After setA
    Value of a is 7

最終的なaの値の出力が42ではなく、42であることを期待しています。グローバル変数のスコープに関するPythonのスコープルールについては何が分かりませんか?




関数の中で、 aはローカル変数として扱われます。

グローバルa

関数の内部