无法理解如何在嵌套闭包中评估自由变量值?

Unable to understand how free variable value is evaluated within nested closure?

我创建了一个 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 本身。