I am learning about high-order functions in python.
I want to understand how arguments pass from the inner function to the outer function.

**Say we have a function that counts how many times another function has run.**

```
def counter(fn, counters):
    print("Creating Outer Function - counter")
    cnt = 0
    def inner(*args, **kwargs):
        print("Creating Inner Function")
        nonlocal cnt
        cnt +=1
        counters[fn.__name__] = cnt
        return fn(*args, **kwargs)
    return inner

c = dict() # This is a dictionary that contains functions and count how many times they ran.

def add_num(a, b):
    return a+b

counted_add = counter(add_num, c)

counted_add(10, 20) # THIS PART I DON'T UNDERSTAND!!!

```

**The last line in the above code I don't understand... How did the outer function manage to understand that 10 and 20 are the args of the inner function?**