In [20]:
g = "orginal global value of 'g'"

def shadowing_first_works():
    g = "locally shadowed value of 'g'"
    print(g)

shadowing_first_works()


locally shadowed value of 'g'

In [21]:
def first_reading_breaks():
    try:
        print(g)
        g = "This line is never executed"
    except UnboundLocalError:
        print("That did not work")
        assert 'g' not in locals()
        assert 'g' in globals()

first_reading_breaks()


That did not work

In [22]:
def declare_as_global_works():
    global g
    print(g)
    g = "This works again!!"
    print(g)

declare_as_global_works()
print("now global value is changed ...", g)


orginal global value of 'g'
This works again!!
now global value is changed ... This works again!!