鱼C论坛

 找回密码
 立即注册
查看: 827|回复: 10

[已解决]python第20课课后题疑问

[复制链接]
发表于 2020-7-31 17:34:39 | 显示全部楼层 |阅读模式

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

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

x
为什么下面这串代码的结果是6,7,8?求大佬解答
def funx():
        x=5
        def funy():
                nonlocal x
                x+=1
                return x
        return funy
a=funx()
print(a())
print(a())
print(a())
最佳答案
2020-8-1 03:30:27
本帖最后由 全能小乌贼 于 2020-8-1 13:19 编辑

观察在funx()函数中的返回值是funy(),也就是说a=funx()运行完成后a变量中存储的值为funy也就是说a = funy, 之后再调用a() = funy(),所以这也是为什么print(a())能够输出值的原因了,因为funy()函数中有返回值x,而nonlocal表示的就是全局变量,也就是说无论你在你写的整个函数中任意地方对这个值进行修改,都会更改这个值,所以调用一次执行一次funy()函数中的自增1,最后就得到了6,7,8.
如果不懂请继续提问我,请给一个好评,你的好评是我回答的动力!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-31 17:35:43 | 显示全部楼层
本帖最后由 xiaosi4081 于 2020-7-31 17:43 编辑

x被存放到了电脑的内部,所以值是保存了下来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 17:38:53 | 显示全部楼层
请见:

https://fishc.com.cn/forum.php?mod=viewthread&tid=144519
https://fishc.com.cn/thread-158933-1-1.html

PS:善用论坛的【搜索】功能,那里可能有你想要的【答案】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 18:47:57 | 显示全部楼层
xiaosi4081 发表于 2020-7-31 17:36
nonlocal就是存放到寄存器的关键字

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

使用道具 举报

发表于 2020-8-1 03:30:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 全能小乌贼 于 2020-8-1 13:19 编辑

观察在funx()函数中的返回值是funy(),也就是说a=funx()运行完成后a变量中存储的值为funy也就是说a = funy, 之后再调用a() = funy(),所以这也是为什么print(a())能够输出值的原因了,因为funy()函数中有返回值x,而nonlocal表示的就是全局变量,也就是说无论你在你写的整个函数中任意地方对这个值进行修改,都会更改这个值,所以调用一次执行一次funy()函数中的自增1,最后就得到了6,7,8.
如果不懂请继续提问我,请给一个好评,你的好评是我回答的动力!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-8-1 08:10:18 | 显示全部楼层
本帖最后由 Twilight6 于 2020-8-1 08:11 编辑


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() 的值都是不一样的

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

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

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

综上所述,最后结果就为 6,7,8


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

使用道具 举报

发表于 2021-9-4 10:49:14 | 显示全部楼层
Twilight6 发表于 2020-8-1 08:10
当你调用 a = funX() 时候,返回的是 funY  而你 funX() 函数设置的返回值就是 funY 这里没带括号, ...

但是funY()不是不能直接访问吗?不得通过funX()来访问吗?我假如直接把第二个print变成print(funY()),他直接报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-4 20:17:23 | 显示全部楼层
向未来前进 发表于 2021-9-4 10:49
但是funY()不是不能直接访问吗?不得通过funX()来访问吗?我假如直接把第二个print变成print(funY()),他 ...

认真理解下楼上的评论, funY 要通过 funX 来返回赋值  你直接 print 肯定报错,没定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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