鱼C论坛

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

[已解决]求助关于def定义的问题!!!!!

[复制链接]
发表于 2020-8-27 17:08:08 | 显示全部楼层 |阅读模式

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

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

x
tttt
最佳答案
2020-8-27 17:45:18
这是函数闭包。
funX()返回的是一个函数名,也就是一个可执行函数,相当于将funY()函数重新起了一个小名为a
a=funX()时,执行一次funX()函数,也就是说执行一次 x=5 赋值,之后不在执行x=5赋值,因为之后的三行都没有在执行funX()函数
之后的上print执行的是a(),也就是funY()函数,没每执行一次,x的值就会加一,因此输出的分别是6 7 8
def funX():
    x=5
    def funY():
        nonlocal x
        x+=1
        return x
    return funY

print(funX()())
print(funX()())
print(funX()())
上面的这种写法,相当于每次都要执行funX函数,因此每次都会给x赋值为5,每次输出都是6

为什么每一次print ,x都会被重新定义,难道是直接跳过了x=5这个步骤吗?

为什么每一次print ,x都会被重新定义,难道是直接跳过了x=5这个步骤吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-27 17:30:54 | 显示全部楼层
a= funX()之后,当我们调用a()的时候就是相当于funX()()了,这个能明白吧?然后为什么funX()()等于funY()呢?当然是因为funX()的返回值等于funY啦。
我们定义一个函数的时候 比如 funX ,这样的是函数体,而加上括号,是调用这个函数。调用函数得到的是这个函数的返回值。也就是,函数执行了什么是函数内规定的东西,是它的步骤。而这个函数调用后的结果是它的返回值。
所以每次print(a())其实就是print(funY())了。这样每次直接调用funY,不调用funX,所以不会执行Y以外的x=5.而只会在之前的基础上执行x+=1.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 17:45:18 | 显示全部楼层    本楼为最佳答案   
这是函数闭包。
funX()返回的是一个函数名,也就是一个可执行函数,相当于将funY()函数重新起了一个小名为a
a=funX()时,执行一次funX()函数,也就是说执行一次 x=5 赋值,之后不在执行x=5赋值,因为之后的三行都没有在执行funX()函数
之后的上print执行的是a(),也就是funY()函数,没每执行一次,x的值就会加一,因此输出的分别是6 7 8
def funX():
    x=5
    def funY():
        nonlocal x
        x+=1
        return x
    return funY

print(funX()())
print(funX()())
print(funX()())
上面的这种写法,相当于每次都要执行funX函数,因此每次都会给x赋值为5,每次输出都是6

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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