鱼C论坛

 找回密码
 立即注册
查看: 46|回复: 2

[学习笔记] 关于函数闭包的个人理解

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数闭包:
[]
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 修改第一层函数变量。
核心思想是,每一层单独保留变量指向;仅允许上层或自身调用。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
你的理解基本正确,但有一些地方可以稍微调整一下,以帮助你更好地理解闭包。

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 4 天前 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-16 18:14 编辑

        可以这么理解,所谓的闭包其实就是一个可以保存静态变量的函数,普通函数在调用结束的时候,所属的所有局部变量都会丢失,而在闭包中,外部变量可以被保存,但是,这个变量是只读的,只有用 nonlocal 声明过后,这个变量(例如,本例中,myfunc_1() 所使用的变量的变量 a)才可以被修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表