web-dev-qa-db-ja.com

Python=グローバルステートメントとは何ですか?

global statementとは何ですか?そして、それはどのように使用されますか? Pythonの公式定義 ;を読みました。
しかし、私にはあまり意味がありません。

32
Capurnicus

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で導入されたのはそのためです。 nonlocalglobalの拡張機能で、別のスコープから取得した変数を、どのスコープから取得しても変更できます。

57
mgilson

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 を読むことを強くお勧めします。

1
YOUNG

基本的に、デフォルトのローカルレベルではなく、グローバルレベルで指定された変数を変更または割り当てる必要があることをインタープリターに伝えます。

0
Jakob Bowyer
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
0
StoryTeller

それを変更する各関数でグローバル変数として宣言することにより、他の関数でグローバル変数を使用できます

Pythonは、globalキーワードを明示的に要求することで、あなたが実際にそれを使っていることを本当に知っていることを確認したいと考えています。

この回答 を参照してください

0
vivek