hao1232 发表于 2024-11-16 16:36:08

关于函数闭包的个人理解

函数闭包:
[]
c = 5
def myfunc():
    a = 3
    def myfunc_1():
      b = 4
      print(a, b, c)
    return myfunc_1
[]
以上是最简单的一个函数闭包;
运行结果:
f = myfunc()
f()
3, 4, 5
其中每一次函数都可以看作一层;
如第一层(主函数)储存值: c → 5
                           第二层:a →3
                           第三层:b → 4
其中上层(这里指定数字大为上层)可以调用下层变量值,而下层不能调用上层变量值。
类似与金字塔;
若需要用上层对下层进行修改,则需使用nonlocal 修改下层函数变量;
用global 修改第一层函数变量。
核心思想是,每一层单独保留变量指向;仅允许上层或自身调用。

FishC 发表于 2024-11-16 16:36:20

你的理解基本正确,但有一些地方可以稍微调整一下,以帮助你更好地理解闭包。

1. **层级关系**:
   - 在闭包中,较高层次的函数(外层函数)可以访问较低层次函数(内层函数)的变量,这与你说的“上层可以调用下层变量值”稍有不同。实际上,内层函数访问的是它定义时外层函数的变量环境。

2. **闭包的定义**:
   - 闭包是指在其外围函数的作用域环境中引用了自由变量的函数。这个函数可以在它定义的作用域之外被调用,并且仍然能够访问这些自由变量。
   
3. **变量作用域**:
   - 你的例子中,`myfunc_1`是`myfunc`的内部函数,它可以访问`a`和`c`,即它的自由变量。`a`在`myfunc`的作用域中,`c`是在全局作用域中。
   
4. **修改变量**:
   - 要修改外层函数的局部变量,使用`nonlocal`关键字。例如,如果要在`myfunc_1`中修改`a`,则需要在`myfunc_1`内用`nonlocal a`声明。
   - `global`关键字用于标识全局变量,允许在函数内部修改全局变量。

通过这些理解,你的闭包概念将更加清晰。每层的作用域之间的关系并非像金字塔结构,而是更像嵌套盒子,内层函数能够“看到”包围它的盒子(即作用域)中的变量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-11-16 18:00:14

本帖最后由 jackz007 于 2024-11-16 18:14 编辑

      可以这么理解,所谓的闭包其实就是一个可以保存静态变量的函数,普通函数在调用结束的时候,所属的所有局部变量都会丢失,而在闭包中,外部变量可以被保存,但是,这个变量是只读的,只有用 nonlocal 声明过后,这个变量(例如,本例中,myfunc_1() 所使用的变量的变量 a)才可以被修改。
页: [1]
查看完整版本: 关于函数闭包的个人理解