鱼C论坛

 找回密码
 立即注册
查看: 1175|回复: 3

[已解决]函数变量初始化

[复制链接]
发表于 2020-7-4 21:32:16 | 显示全部楼层 |阅读模式

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

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

x
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

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

这段代码输出结果6、7、8。
小甲鱼的答案说当 a = funX() 的时候,只要 a 变量没有被重新赋值,funX() 就没有被释放,也就是说局部变量 x 就没有被重新初始化。
研究了半天还是没想明白为啥x没有被初始化
最佳答案
2020-7-4 21:33:29


看看这个能不能看懂吧,鱼友们经常会问起这个问题:

def funX():
    x = 5

    def funY():
        nonlocal x
        x += 1
        return x

    return funY

a = funX()


当你调用 a = funX() 时候,返回的是 funY  而你 funX() 函数设置的返回值就是 funY 这里没带括号,是返回的一整个函数体,也就是 funY函数

所以这里实际上你一调用完 funX() 时候a就等于了 funY,即 a = funY (没带括号,是指这个函数),这个时候 x 相对于  a 来说是个全局变量,也就是函数可以看成是这样的:

def funY():
        nonlocal x
        x += 1
x = 5
a = funY


而你每次 a() 都是等于调用了一次 funY() 导致每次调用 x 都 + 1 ,所以每次调用 a() 的值都是不一样的

你要记着,当函数名带上括号就是调用这个函数,返回的是函数运行的结果

而只有函数名时候,相当于是把这个函数赋值给了一个变量,这个变量就是这个函数的 别名,也可以说是外号~

当你调用这个变量时候,实际上就是在调用赋值的函数体本身

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

使用道具 举报

发表于 2020-7-4 21:33:29 | 显示全部楼层    本楼为最佳答案   


看看这个能不能看懂吧,鱼友们经常会问起这个问题:

def funX():
    x = 5

    def funY():
        nonlocal x
        x += 1
        return x

    return funY

a = funX()


当你调用 a = funX() 时候,返回的是 funY  而你 funX() 函数设置的返回值就是 funY 这里没带括号,是返回的一整个函数体,也就是 funY函数

所以这里实际上你一调用完 funX() 时候a就等于了 funY,即 a = funY (没带括号,是指这个函数),这个时候 x 相对于  a 来说是个全局变量,也就是函数可以看成是这样的:

def funY():
        nonlocal x
        x += 1
x = 5
a = funY


而你每次 a() 都是等于调用了一次 funY() 导致每次调用 x 都 + 1 ,所以每次调用 a() 的值都是不一样的

你要记着,当函数名带上括号就是调用这个函数,返回的是函数运行的结果

而只有函数名时候,相当于是把这个函数赋值给了一个变量,这个变量就是这个函数的 别名,也可以说是外号~

当你调用这个变量时候,实际上就是在调用赋值的函数体本身

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

使用道具 举报

 楼主| 发表于 2020-7-4 21:47:17 | 显示全部楼层
Twilight6 发表于 2020-7-4 21:33
看看这个能不能看懂吧,鱼友们经常会问起这个问题:

可是funY()是个内嵌函数,我在程序外部print(a())应该不能直接进到funY函数里呀,应该是得先到funX再到funY吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-4 21:49:33 | 显示全部楼层
好吃的小笼包 发表于 2020-7-4 21:47
可是funY()是个内嵌函数,我在程序外部print(a())应该不能直接进到funY函数里呀,应该是得先到funX再到fu ...


当你调用 a = funX() 时候,返回的是 funY  而你 funX() 函数设置的返回值就是 funY 这里没带括号,是返回的一整个函数体,也就是 funY函数

所以这里实际上你一调用完 funX() 时候a就等于了 funY,即 a = funY (没带括号,是指这个函数),这个时候 x 相对于  a 来说是个全局变量,也就是函数可以看成是这样的:


这句话试着好好理解下,因为函数返回的是内嵌函数,所以 a 的作用域也就暂时属于内嵌函数中的,原本外部是无法进入内部,但是将内部的函数返回就是不一样的情况了


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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