1# test scoping rules
2
3# explicit global variable
4a = 1
5def f():
6    global a
7    global a, a # should be able to redefine as global
8    a = 2
9f()
10print(a)
11
12# explicit nonlocal variable
13def f():
14    a = 1
15    def g():
16        nonlocal a
17        nonlocal a, a # should be able to redefine as nonlocal
18        a = 2
19    g()
20    return a
21print(f())
22
23# nonlocal at inner-inner level (h)
24def f():
25    x = 1
26    def g():
27        def h():
28            nonlocal x
29            return x
30        return h
31    return g
32print(f()()())
33
34# nonlocal declared at outer level (g), and referenced by inner level (h)
35def f():
36    x = 1
37    def g():
38        nonlocal x
39        def h():
40            return x
41        return h
42    return g
43print(f()()())
44