inner() can access the non-local variable x in middle() with nonlocal x:
def outer():
    x = 0
    def middle():
        x = 5 # <- Here
        def inner():
            nonlocal x # Here
            x += 1
            print(x) # 6
        inner()
    middle()
outer()
Now, how can inner() access the non-local variable x in outer()?
def outer():
    x = 0 # <- Here
    def middle():
        x = 5
        def inner():
            x += 1
            print(x) # How to print 1?
        inner()
    middle()
outer()
 
    