如何在嵌套闭包中确定自由变量值?

How free variable value is determined 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',)

我的理解是应该是('current', 'n')因为有2 free variables 这里。

为什么 print(fn.__code__.co_freevars) 没有打印 ('current', 'n')

你在inner中定义了current,所以它在那里是一个普通的局部变量。 currentinc 中的闭包变量。

考虑:

inner = incrementer(2)
inc = inner(1)

print(inner.__code__.co_freevars)
print(inc.__code__.co_freevars)

输出:

('n',)
('current', 'n')

再举个例子:

def outer():
    var1 = 1
    var2 = 2
    var3 = 3
    var4 = 4
    def middle():
        var1
        var2
        def inner():
            var2
            var4
        return inner
    return middle


middle = outer()
inner = middle()

print(outer.__code__.co_freevars)
print(middle.__code__.co_freevars)
print(inner.__code__.co_freevars)

输出:

()
('var1', 'var2', 'var4')
('var2', 'var4')

第一次打印:

outer 没有闭包变量。

第二次打印:

var1var2var4 用于 middle 并且来自外部作用域。是的,var4用在了middle中。在inner的定义中,是在middle.

里面定义的

第三次打印:

var2var4inner 中使用并且来自外部作用域。