lzb1001 发表于 2023-5-23 16:23:14

嵌套函数(或称内部函数)和 闭包

def funOut():
        def funIn():
                print('宾果!你成功访问到我啦!')
        return funIn

上面这个属于嵌套函数(或称内部函数)-------1


def FunX(x):
        def FunY(y):
                return x * y
        return FunY


def Fun1():
        x = 5
        def Fun2():
                x *= x
                return x
        return Fun2()

上面这两个属于闭包(由内部函数演化而来)-------2

请大神帮忙看看1和2的说法没错吧?

isdkz 发表于 2023-5-23 16:33:33

在这里,你已经给出了一个嵌套函数的例子和两个闭包的例子。首先,让我们分别对它们进行解释。

嵌套函数(或称内部函数)就是函数内部定义的函数。在你的第一个例子中, funIn 就是一个嵌套函数,因为它在 funOut 函数内部定义。

然而,闭包是指那些引用了其包围范围(或称“环境”)中变量的函数,而这些变量在该函数被调用时可能已经离开了它们最初的作用域。简单来说,闭包就是一个函数和其相关的引用环境组合的一个整体(或者说数据结构)。

在你的第二个例子中, FunY 就是一个闭包,因为它引用了外部函数 FunX 的参数 x 。

然而,你的第三个例子中, Fun2 不是一个闭包。在这里, Fun2 试图修改 Fun1 中的 x ,但由于Python的变量作用域规则,这实际上是会报错的。在 Fun2 内部, x 被视为局部变量,所以它不能引用或修改外部函数 Fun1 中的 x 。要想修改 Fun1 中的 x ,需要在 Fun2 内部使用 nonlocal 关键字,如下:

def Fun1():
    x = 5
    def Fun2():
      nonlocal x
      x *= x
      return x
    return Fun2()


在这个修改后的版本中, Fun2 现在是一个闭包,因为它修改并返回了其包围环境 Fun1 中的变量 x 。

lzb1001 发表于 2023-5-23 18:34:53

本帖最后由 lzb1001 于 2023-5-23 18:38 编辑

isdkz 发表于 2023-5-23 16:33
在这里,你已经给出了一个嵌套函数的例子和两个闭包的例子。首先,让我们分别对它们进行解释。

嵌套函数 ...

大神的意思是:

第三个例子在改造前内部函数Fun2()不是一个闭包,经过改造以后的内部函数Fun2()才是一个闭包?

冒昧的说下:

按照小甲鱼在教材中对闭包的定义和解说,我怎么感觉改造前和改造后的内部函数Fun2()都是一个闭包啊?

sfqxx 发表于 2023-5-23 19:44:00

你对内部函数和闭包的理解基本上是正确的。

对于第一个例子,确实是一个嵌套函数(或内部函数),因为在函数 funOut 中定义了另一个函数 funIn,并将其作为返回值返回。在 Python 中,内部函数就是指在一个函数体内定义的函数。

对于第二个例子,它涉及到了嵌套函数和闭包的概念。嵌套函数是在一个函数体内定义的函数,而闭包则是由内部函数和外层函数中的变量构成的一个函数对象。

在函数 FunX 中,内部函数 FunY 捕获了外层函数中的变量 x,并将其作为参数返回。这样,调用函数 FunX 返回的函数对象 FunY 就可以使用外层函数中的变量 x 了。因此,函数 FunX 返回的函数对象 FunY 就是一个闭包。

至于第二个例子中 Fun2 函数的闭包,需要稍微解释一下。在函数 Fun2 中,你尝试修改了变量 x 的值,但是这个变量是外层函数 Fun1 中的局部变量,并不是内部函数 Fun2 的自由变量(相当于被捕获的变量)。

由于变量 x 不是 Fun2 的自由变量,所以在 Fun1 中修改它的值并不会影响到 Fun2 的变量。因此,函数 Fun2 中捕获的变量 x 和外层函数 Fun1 中的变量 x 是两个不同的变量。

综上所述,内部函数和闭包都是 Python 语言中的重要特性,理解它们的概念和用法对于编写高质量的 Python 代码非常重要。
页: [1]
查看完整版本: 嵌套函数(或称内部函数)和 闭包