2012-12-14 15 views
13

グローバルステートメントとは何ですか?それはどのように使用されていますか?私はPython's official definitionを読んだ。
しかし、私にはそれほど意味がありません。Pythonでは、グローバルステートメントとは何ですか?

+3

2.4はPythonの古いバージョンです。[python 2.Xバージョンの実際の参照はこちら](http://docs.python.org/2/reference/simple_stmts.html#global) –

+2

Python 3には 'global 'と一緒に' nonlocal'という新しいステートメントが付いています。 –

+0

@ TahaJahangir - それは良い点です。私はあなたのコメントのために私の答えで 'nonlocal'に少し斬新を加えました。ありがとう! – mgilson

答えて

31

すべての "変数" を参照してください。 Pythonの "file"のスコープはモジュールスコープです。考えてみましょう以下:ローカルスコープを持つ

#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 

あなたがglobalキーワードを使用している場合、あなたはfunc内からモジュールスコープでmyvariableの値を変更することができます。

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の値を変更します。そのため、nonlocalというキーワードがpython3.xで導入されました。 nonlocalは、globalの拡張で、そのスコープから他のスコープから取得した変数を変更することができます。

+0

+1を徹底的に説明してください。ただし、印刷ステートメントの結果を表示したい場合があります。 –

+0

@StevenRumbalski - 完了。良い提案。 – mgilson

+0

あなたの答えを読んだ後、これを自分自身でテストしました。私の理解はこの件に関して大幅に改善されました。どうもありがとうございました! – Capurnicus

0

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

あなたは、Pythonは、あなたが本当にそれはあなたが明示的に要求することにより、一緒に遊んでいるものを知っていることを確認したい

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

0
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

グローバルキーワード。

は、一定の範囲に制限されているPythonでthis answer

1

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] 

ローカル変数を初期化するために可能でした。あなたはコメントを解除#リスト1 = [9]、あなたは

UnboundLocalError: local variable 'list1' referenced before assignment 

を取得する場合はそれはあなたが新しいローカル変数「リスト1」を初期化しようとしているが、それはすでに前に参照された、 そしてあなたがあることを意味し

それを再割り当てするためにスコープから外します。

スコープを入力するには、 'list1'をグローバルとして宣言します。

最終的にタイプミスがあっても、thisを読むことを強くお勧めします。

関連する問題