global statementとは何ですか?そして、それはどのように使用されますか? Pythonの公式定義 ;を読みました。
しかし、私にはあまり意味がありません。
pythonのすべての「変数」は特定のスコープに制限されます。python「ファイル」のスコープはモジュールスコープです。以下を考慮してください。
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
ローカルスコープを持つオブジェクトは、関数が終了するとすぐに消滅し、(return
オブジェクトでない限り)取得できませんが、関数内では、モジュールレベルスコープ(または含まれているスコープ)の変数にアクセスできます。
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
ただし、その参照で割り当てを使用することはできず、外部スコープに伝達されることを期待できます。
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
さて、ついにglobal
になりました。 global
キーワードは、関数内の特定の変数がグローバル(モジュールレベル)スコープで定義されていることをpython)に伝える方法です。
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
つまり、myvariable
キーワードを使用すると、func
内からモジュールスコープのglobal
の値を変更できます。
余談ですが、スコープは任意の深さにネストできます。
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
この場合、グローバルスコープで変数は宣言されておらず、python2では、func1
のスコープのx
の値を変更する(簡単/クリーン)方法はありませんfunc3
内。 nonlocal
キーワードがpython3.xで導入されたのはそのためです。 nonlocal
はglobal
の拡張機能で、別のスコープから取得した変数を、どのスコープから取得しても変更できます。
mgilsonは良い仕事をしましたが、もう少し追加したいと思います。
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
関数内では、Pythonは、グローバル変数として宣言するか、グローバル変数にアクセスする場合を除き、すべての変数をローカル変数と見なします。
list1.append(2)
「list1」にアクセスしており、リストが変更可能であるため、可能になりました。
list2 = [222]
ローカル変数を初期化するため、可能だった。
ただし、#list1 = [9]のコメントを外すと、
UnboundLocalError: local variable 'list1' referenced before assignment
これは、新しいローカル変数「list1」を初期化しようとしているが、すでに以前に参照されていたため、再割り当てのスコープ外にいることを意味します。
スコープに入るには、「list1」をグローバルとして宣言します。
最後にタイプミスがあったとしても this を読むことを強くお勧めします。
基本的に、デフォルトのローカルレベルではなく、グローバルレベルで指定された変数を変更または割り当てる必要があることをインタープリターに伝えます。
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
それを変更する各関数でグローバル変数として宣言することにより、他の関数でグローバル変数を使用できます
Pythonは、globalキーワードを明示的に要求することで、あなたが実際にそれを使っていることを本当に知っていることを確認したいと考えています。
この回答 を参照してください