This article is based on the results of Python 3.7.6.
To make a closure in Python, I wrote code like this:
def f():
    x = 0
    def g():
        x += 1
    g()
f()
The function g refers to the variable x defined within the scope of the function f and is trying to add 1 to it.
Doing this will result in an error at x + = 1.
UnboundLocalError: local variable 'x' referenced before assignment
It says that the local variable x was referenced before the assignment. This is because we have created another new variable in g instead of referencing x in f.
The above code can be rewritten separately for convenience of declaration and assignment as follows. It uses var as a pseudo syntax for variable declaration.
#note:var is not the correct Python grammar. See above
def f():
    var x           #local variable of f'x'Declare
    x = 0           #Substitute 0 for x
    def g():        #Define the internal function g of f
        var x       #local variable of g'x'Declare
                    #It happens that f also has a variable with the same name, but a different variable
        x += 1      #Add 1 to x(x = x +Syntactic sugar of 1)
                    #Attempts to refer to the value before addition, but an error because it has not been assigned yet
    g()
To express the original intention, write as follows.
def f():
    x = 0
    def g():
        nonlocal x   ## (*)
        x += 1
    g()
Add nonlocal, like(*). This will look for the x defined in the scope one outside (one outside of g = f).