2017-06-16 13 views
1

マイmain()関数があり、そのメソッドを呼び出すが、その変数名を参照しないことで、オブジェクトを編集することができます。は、なぜ私が小さい範囲内から

def main(): 
    ... 
    def _help(): 
     ... 
1  a += somelist 
2  a.append(something) 

    a=[] 
    _help() 

奇妙何ライン2は完全に正常に動作していることですが、 ライン1は、私はmainまたは_helpのいずれかの上部にグローバル変数としてa宣言した場合でも、それはまだ動作しませんUnboundLocalError: Local variable 'a' referenced before assignment.

をスローします。どうしてこれなの?
これらの行の両方が同じ変数を編集しているため、どちらかまたは両方とも動作するはずです。 行1を動作させるにはどうすればよいですか?

答えて

2

<variable> = <something>をPythonで使用するときは、特に指示がない限り、Pythonは自動的にローカル変数とみなします。例えば

:この場合

a = 1 
def f(): 
    if False: 
     a = 0 
    print(a) # UnboundLocalError 
f() 

、ならびに割当として+=作品が、.appendaに割り当てるが、メソッドを呼び出していません。

これはあなたの関数でnonlocal aを置くことによって固定されているので、その範囲のa外に割り当てることができます。

def main(): 
    ... 
    def _help(): 
     nonlocal a 
     a += somelist # Works! 

をしかし、この場合には、あなただけのa.extend(somelist)を行うことができます。

+0

非ローカルとグローバルとの違いは? –

+0

@ A-P 'x = 7; def f():def g():非ローカルx; #xは未定義です。それはf()内のxを探していますが、グローバルではありません。 'x = 7; def f():def g():グローバルx; #x == 7'。 – Artyer

関連する問題