I have created a nested closure
which looks as below:
def incrementer(n):
def inner(start):
current = start
def inc():
nonlocal current
current = n
return current
return inc
return inner
fn = incrementer(2)
Now, when I print value of co_freevars
for fn
I get below output:
print(fn.__code__.co_freevars) -> ('n',)
My understanding is that it should be ()
because there are no free variables
directly inside inner
.
Why print(fn.__code__.co_freevars)
is not printing ()
?
CodePudding user response:
Think about what def inc
is actually doing: it’s creating a closure object populated with references (cells) to current
and n
. For (a closure created for) inner
to be able to do that, it must have a reference to n
itself.