Python
1def scope():
2 loc = "init" # scope's loc bind "init"
3 def do_local():
4 loc = "local" # do_local's loc bind "local"
5 def do_nonlocal():
6 nonlocal loc # loc is scope's loc
7 loc = "nonlocal" # scope's loc bind "nonlocal"
8 def do_global():
9 global loc # loc is global's loc
10 loc = "global" # global's loc bind "global"
11
12 do_local() # do_local's loc bind "local"
13 print("A:", loc) # scope's loc binding "init"
14 do_nonlocal() # scope's loc bind "nonlocal"
15 print("B:", loc) # scope's loc binding "nonlocal"
16 do_global() # global's loc bind "global"
17 print("C:", loc) # scope's loc binding "nonlocal"
18
19scope()
20print("D:", loc) # global's loc binding "global"
21
補足事項として今回のコードのようにローカルなスコープ内でも global 宣言して global 変数を定義可能です。
(Python では変数への代入が変数の定義です)
気を付けることとして、変数を参照するだけの場合は外側のスコープの変数になる点があります。
気を付けることとして、関数内のスコープで global, nonlocal の宣言がなく、変数とオブジェクトの束縛関係を更新しない場合は外側のスコープの変数になる点があります。
Python
1loc = "foo"
2def scope():
3 print("E:", loc) # loc is global's loc
4 def do_local():
5 print("F:", loc) # loc is global's loc
6 do_local()
7
8scope()
9# E: foo
10# F: foo
Python
1lst = [0, 1, 2]
2def scope():
3 print("G:", lst) # lst is global's loc
4 def do_local():
5 lst[1] = 4 # lst is global's loc lst 変数の束縛関係は更新されない
6 print("H:", lst) # lst is global's loc
7 do_local()
8 lst[0] = 3 # lst is global's loc lst 変数の束縛関係は更新されない
9 print("I:", lst) # lst is global's loc
10
11scope()
12# G: [0, 1, 2]
13# H: [0, 4, 2]
14# I: [3, 4, 2]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。