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

发布于 2025-01-09 08:38:31 字数 574 浏览 0 评论 0原文

我创建了一个嵌套闭包,如下所示:

def incrementer(n):
    def inner(start):
        current = start
        def inc():
            nonlocal current
            current += n
            return current
        return inc
    return inner

fn = incrementer(2)

现在,当我打印fnco_freevars值时,我得到以下输出:

print(fn.__code__.co_freevars) -> ('n',)

我的理解是它应该是(),因为inner内部直接没有没有自由变量

为什么 print(fn.__code__.co_freevars) 不打印 ()

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 ()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吖咩 2025-01-16 08:38:31

想想 def inc 实际上在做什么:它正在创建一个 closure 对象,其中填充了对当前n。为了让inner(为其创建的闭包)能够做到这一点,它必须具有对n本身的引用。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文