Numba supports closures (nested functions), and keeps the variable scopes alive for the lifetime of the closures. Variables that are closed over by the closures (cell variables) have one consistent type throughout the entirety of the function. This means differently typed variables can only be assigned if they are unifyable, such as for instance ints and floats:
@autojit
def outer(arg1, arg2):
arg1 = 0
arg1 = 0.0 # This is fine
arg1 = "hello" # ERROR! arg1 must have a single type
arg2 = 0
arg2 = "hello" # FINE! Not a cell variable
def inner():
print arg1
return inner
Calling an inner function directly in the body of outer will result in a direct, native call of the closure. In the future it is likely that passing around the closure will still result in a native call in other places.
Like Python closures, closures can be arbitrarily nested, and follow the same scoping rules.