鱼C论坛

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

[已解决]45讲 课后题 问题求助

[复制链接]
发表于 2023-3-21 16:25:39 | 显示全部楼层 |阅读模式

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

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

x
def outter():
    def innerA():
        x = 100
    
    def innerB():
        nonlocal x
        x = 250
    
    def innerC():
        global x
        x = 520
    
    x = 880
    
    innerA()
    print(f"调用完 innerA() 函数之后,x = {x}")
    
    innerB()
    print(f"调用完 innerB() 函数之后,x = {x}")
    
    innerC()
    print(f"调用完 innerC() 函数之后,x = {x}")
    
outter()
print(f"此时此刻,全局变量 x = {x}")


这一段 代码 执行结果为
调用完 innerA() 函数之后,x = 880
调用完 innerB() 函数之后,x = 250
调用完 innerC() 函数之后,x = 250
此时此刻,全局变量 x = 520
innerA  相当于是局部函数,x输出应该是outer层的x,是880
innerB 使用了nonlocal,所以是将b下面的新定义的x传导到了外层,是250
但是不理解的是c
c相当于定义了一个全局函数,所以innerC为什么输出的不是520呢

最佳答案
2023-3-21 16:34:05
你也说了,调用 innerB 将新定义的 x 传到了外层函数 outter,这个 x 是 250,也就是 outter 中有一个局部变量 x = 250

在 innerC 中将 x = 520 传到了全局变量中

而你在调用完 innerC 的时候 print 还是在 outter 函数里面,

既然 outter 函数都有一个局部变量 x = 250,那肯定是访问到局部变量 x 呀

你把 print(f"调用完 innerC() 函数之后,x = {x}") 改成
print(f"调用完 innerC() 函数之后,x = {globals()['x']}")

这样就可以访问到局部变量 x 了

或者你在调用 innerC() 之后或之前可以把局部变量 x 删掉,就可以直接访问全局变量 x 了
    innerC()
    del x                            # 删掉局部变量 x
    print(f"调用完 innerC() 函数之后,x = {x}")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-21 16:34:05 | 显示全部楼层    本楼为最佳答案   
你也说了,调用 innerB 将新定义的 x 传到了外层函数 outter,这个 x 是 250,也就是 outter 中有一个局部变量 x = 250

在 innerC 中将 x = 520 传到了全局变量中

而你在调用完 innerC 的时候 print 还是在 outter 函数里面,

既然 outter 函数都有一个局部变量 x = 250,那肯定是访问到局部变量 x 呀

你把 print(f"调用完 innerC() 函数之后,x = {x}") 改成
print(f"调用完 innerC() 函数之后,x = {globals()['x']}")

这样就可以访问到局部变量 x 了

或者你在调用 innerC() 之后或之前可以把局部变量 x 删掉,就可以直接访问全局变量 x 了
    innerC()
    del x                            # 删掉局部变量 x
    print(f"调用完 innerC() 函数之后,x = {x}")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-21 16:49:51 | 显示全部楼层
python新人见解:
应该是作用域的不同
nonlocal作用在函数里
global作用在函数外
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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