首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能解释一下b是从哪里来的吗?

你能解释一下b是从哪里来的吗?
EN

Stack Overflow用户
提问于 2021-10-16 16:13:49
回答 4查看 64关注 0票数 0

我只是不明白,我们从来没有在内部函数中定义参数b,但是为什么内部函数接受a+b而没有错误呢?

代码语言:javascript
复制
def test(a):
    def add(b):
        nonlocal a
        a += 1
        return a+b
    return add


func = test(4)
print(func(4))

上面的函数来自这里:https://www.w3resource.com/python-exercises/python-functions-exercise-19.php

EN

回答 4

Stack Overflow用户

发布于 2021-10-16 16:40:45

下面是这个函数中发生的事情:

  • 第1行创建test(),这是一个闭包工厂函数。这意味着每次调用它都会创建一个新的闭包,然后将闭包返回给调用者。
  • 第2行定义了add(),这是一个内部函数,它接受单个参数

,并返回add()表达式的结果6返回add()作为函数对象,而不调用它。

现在的问题是add()从哪里得到a的值?这就是闭包发挥作用的地方。add()从外部函数test()获取a的值。当您在第9行调用test()时,Python将执行以下操作:

  • 定义add()的新实例,该实例采用单个变量基。
  • add()的周围状态进行快照,其中包括a及其当前值(在第9行中,您正在将其定义为add()及其整个周围状态。

这样,当您在第10行调用由test()返回的add()实例时,您将看到该函数记住了a的值!因此,您得到的是先前分配给a = 4的值(第9行)和新传递的参数- b = 4的值(第10行)。

希望这有助于澄清!

票数 1
EN

Stack Overflow用户

发布于 2021-10-16 16:53:20

它是如何编写的,是访问函数中定义的函数的典型方式。这是通过在调用main函数时返回所需函数来实现的。例如:下面的代码中定义了两个函数TEST(),其中一个函数被调用:

代码语言:javascript
复制
def test(a):
    def times(b):
        nonlocal a
        return a*b
    def add(b):
        nonlocal a
        a += 1
        return a+b
    return times


func = test(4) print(func(4))

在本例中,输出为16。

票数 1
EN

Stack Overflow用户

发布于 2021-10-16 16:20:32

您将在此调用中传递bfunc(4)

需要说明的是,func就是add

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69597375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档