我创建了一个nested closure
,如下所示:
def incrementer(n):
def inner(start):
current = start
def inc():
nonlocal current
current += n
return current
return inc
return inner
fn = incrementer(2)
现在,当我为fn
打印co_freevars
的值时,我得到以下输出:
print(fn.__code__.co_freevars) -> ('n',)
我的理解是应该是()
,因为inner
里面直接有no free variables
。
为什么print(fn.__code__.co_freevars)
不打印()
?
想想def inc
实际在做什么:它创建了一个闭包对象,该对象填充了对current
和n
的引用(单元格(。为了(为inner
创建的闭包(能够做到这一点,它必须具有对n
本身的引用。