34518


`f()`で定義したローカル変数`b`の値を、ネスト関数`g()`から変更するにはどうすれば良いのでしょうか。  
`global a, b`ではうまくいかず、さりとて代案も思いつきませんでした。

[code]

    a = "global!!"
    
    def f():
        global a
        print(a)
        b = "local 1"
    
        def g():
            global a
            print(a)
            print(b) # local variable 'b' referenced before assignment
            b = "local 2"
            print(b)
    
        g()
        print(a)
        print(b)
    
[/code]


CC BY-SA 3.0
2017-05-07T10:53:46.180
34517
2017-05-14T03:12:08.723
2017-05-08T09:17:44.387
3054
22996
question
python python3
関数内のローカル変数の値を、ネストした関数から変更する


ネストした関数からは参照はできても変更はできません。  
最初に書くとネストした関数にローカルな変数になってしまいます。  
（エラーメッセージは「代入される前に参照されている」ということでローカル変数として扱われている）

代案としては参照タイプを使うことです。  
例えば  
`b = ["local 1"]`  
のようにリストにすることで、  
ネストした関数からも  
`b[0] = "local 2"`  
で変更できます。  
（`b`自体は変更できませんがこれで十分かと思います）


CC BY-SA 3.0
2017-05-07T11:16:15.393
34518
2017-05-07T11:24:28.337
2017-05-07T11:24:28.337
5044
5044
34517
answer


[`nonlocal`
文](http://docs.python.jp/3/reference/simple_stmts.html?highlight=nonlocal#the-
nonlocal-statement) が Python3 で追加されました。  
`nonlocal` に指定すると、外のスコープを内側から順に探索して、最初に見付かった変数を参照する事になります。  
ただし、グローバルスコープは探索範囲に含まれません。

[code]

    #!/usr/bin/python3
    
    def f():
        b = "local 1"
        print(b)
        # 出力 -> local 1
    
        def g():
            # 外側の変数 b を参照
            nonlocal b
            b = "local 2"
            print(b)
            # 出力 -> local 2
    
        g()
    
        # 変更されている
        print(b)
        # 出力 -> local 2
    
    f()
    
[/code]


CC BY-SA 3.0
2017-05-14T03:12:08.723
34691
2017-05-14T03:12:08.723
3054
34517
answer