鱼C论坛

 找回密码
 立即注册
查看: 2114|回复: 5

[已解决]旧版python第20课06题

[复制链接]
发表于 2021-10-25 19:33:02 | 显示全部楼层 |阅读模式

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

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

x
以下是“闭包”的一个例子,请你目测下会打印什么内容?
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

a = funX()
print(a())
print(a())
print(a())

小甲鱼的解释是:当 a = funX() 的时候,只要 a 变量没有被重新赋值,funX() 就没有被释放,也就是说局部变量 x 就没有被重新初始化。

这句话无法理解呀,哪位大佬能通俗地讲一讲嘛?
最佳答案
2021-10-26 20:10:52
AliciaChen 发表于 2021-10-26 15:41
对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a( ...

可以这么理解,x在里面是局部变量,a=funX()后,x相当于funX的全局变量,然后运行funY(),就改变了x的值,相当于函数中的函数,变量与局部变量全局变量的关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-25 19:45:36 | 显示全部楼层
函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量便会被释放。
而你的代码中 a = funX(),表示 a 指向 funX() 对象,意思就是 a 就是 funX(),比如:b = 13,一般你没有释放 b,13 就会一直存放在 b 里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 19:45:36 | 显示全部楼层
a=funX(),函数返回的是funY,并没有括号,函数调用是要有括号的,这个时候a就相当于funY,因为a已经赋值funX()了,然后,a=funY,你可以这么理解,然后a() ,其实就相当于funY(),
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 15:35:18 | 显示全部楼层
傻眼貓咪 发表于 2021-10-25 19:45
函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量 ...

“一般只有当函数被调用的时候,局部变量才会被定义”,在这个代码里面 a() 不是表示调用了funX()一次吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-26 15:41:36 | 显示全部楼层
深谙流年 发表于 2021-10-25 19:45
a=funX(),函数返回的是funY,并没有括号,函数调用是要有括号的,这个时候a就相当于funY,因为a已经赋值funX ...

对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a())运行第一次之后,x=6, 也就是说:这里就改变了funX()函数里面的局部变量x,变成了6。
就相当于以下的代码吗?
def funX():
    x = 6
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

a = funX()
print(a())
print(a())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 20:10:52 | 显示全部楼层    本楼为最佳答案   
AliciaChen 发表于 2021-10-26 15:41
对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a( ...

可以这么理解,x在里面是局部变量,a=funX()后,x相当于funX的全局变量,然后运行funY(),就改变了x的值,相当于函数中的函数,变量与局部变量全局变量的关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 23:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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