鱼C论坛

 找回密码
 立即注册
查看: 2591|回复: 1

[已解决]内嵌函数和闭包的疑问

[复制链接]
发表于 2020-2-28 00:22:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 kejun0566 于 2020-2-28 00:37 编辑

def counter():
    c = 0
    def inc():
        nonlocal c
        c += 1
        return c
    return inc

foo = counter()
print(foo(),foo(),foo(),foo(),foo())


这个输出的结果为什么是:1 2 3 4 5,不是应该是1 1 1 1 1 吗?

每次调用foo(),函数的第一行不是都指定了c = 0吗?

【已解决】
最佳答案
2020-2-28 00:43:42
本帖最后由 jackz007 于 2020-2-28 00:45 编辑

        inc() 是 counter() 的内嵌函数,counter() 函数返回的是 inc,也就是内嵌函数 inc() 的调用地址,所以,下面的语句
  1. foo = counter()
复制代码

        实际上完成了对 inc() 外部变量 c 的初始化,并且,foo 就是函数 inc() 的调用地址,每次执行 foo() 的时候,只是单纯地调用 inc(),和 counter() 没有直接关系。在每次执行 inc() 中的
  1.        c += 1
复制代码

        的时候,外部变量 c 值都会加 1,函数执行完后,c 值会一直保持,只要变量 foo 在, c 就会一直都在,只要一直通过 foo() 来调用 inc(),就会累计产生出计数器的效果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-28 00:43:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-2-28 00:45 编辑

        inc() 是 counter() 的内嵌函数,counter() 函数返回的是 inc,也就是内嵌函数 inc() 的调用地址,所以,下面的语句
  1. foo = counter()
复制代码

        实际上完成了对 inc() 外部变量 c 的初始化,并且,foo 就是函数 inc() 的调用地址,每次执行 foo() 的时候,只是单纯地调用 inc(),和 counter() 没有直接关系。在每次执行 inc() 中的
  1.        c += 1
复制代码

        的时候,外部变量 c 值都会加 1,函数执行完后,c 值会一直保持,只要变量 foo 在, c 就会一直都在,只要一直通过 foo() 来调用 inc(),就会累计产生出计数器的效果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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