2017-01-28 8 views
0

私はPythonで一般的なプログラミングのnoobです。約2週間だけプログラムしています。私はPythonの関数に関する簡単な質問があります。 は、誰かがこの作業の理由に説明することができます:関数内の関数

import random 
valuea = valueb = valuec = "0" 
stationary = "X" 
def func1(): 
    print("",valuea,"\n",valueb,"\n",valuec) 
    return 
random.seed(0) 
random_list = ("valuea","valueb","valuec") 
random_result = random.choice(random_list) 
locals()[random_result] = stationary 
func1() 

結果:

0 
X 
0 

しかし、これは、しかし、動作しません:

def func1(): 
    import random 
    valuea = valueb = valuec = "0" 
    stationary = "X" 
    def func2(): 
     print("",valuea,"\n",valueb,"\n",valuec) 
     return 
    random.seed(0) 
    random_list = ("valuea","valueb","valuec") 
    random_result = random.choice(random_list) 
    locals()[random_result] = stationary 
    func2() 
    return 
func1() 

結果:

0 
0 
0 

ママには道があるの?それは第二の状況で機能し、機能の中に寝かせられていますか?

答えて

0

だがより単純な例を見てみよう:

def func1(): 
    a = 0 
    def func2(): 
     print(a) 
    locals()['a'] = 1 
    print(a) 
    func2() 

func1() 
print(a) 

これは、両方の機能に対して、すなわち変数aローカルに変更されない

0 
0 
1 

を出力します。 localsのドキュメントを見ると、 "...変更はインタープリタによって使用されるローカル変数とフリー変数の値に影響しないかもしれません。"

def func1(): 
    d = {'a' : 0} 
    def func2(): 
     print(d['a']) 
    d['a'] = 1 
    print(d['a']) 
    func2() 

func1() 
print(d['a']) 

:したがって、あなたが名前と値を関連付ける場合、私は辞書を使用することをお勧めしたいの代わりに

...または動作しない可能性があり、ローカル変数の値を変更するためにそれを使用してこれは次の出力につながる:dのみfunc1内で定義されているので、最後の行によって引き起こさ

1 
1 
Traceback (most recent call last): 
    File "...", line 10, in <module> 
    print(d['a']) 
NameError: name 'd' is not defined 

例外は正しい動作です。したがって、func1の範囲外にアクセスすることはできません。

スコープの詳細については、こちらをご覧ください。 here

+0

ありがとうございます!もう一度:) – IrvinLesh

+0

Np - それはおそらく私の欠点でした。リストの変種を最初から表示する方が良いでしょう。 –