鱼C论坛

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

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

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

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

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

x
  1. def outter():
  2.     def innerA():
  3.         x = 100
  4.    
  5.     def innerB():
  6.         nonlocal x
  7.         x = 250
  8.    
  9.     def innerC():
  10.         global x
  11.         x = 520
  12.    
  13.     x = 880
  14.    
  15.     innerA()
  16.     print(f"调用完 innerA() 函数之后,x = {x}")
  17.    
  18.     innerB()
  19.     print(f"调用完 innerB() 函数之后,x = {x}")
  20.    
  21.     innerC()
  22.     print(f"调用完 innerC() 函数之后,x = {x}")
  23.    
  24. outter()
  25. print(f"此时此刻,全局变量 x = {x}")
复制代码



这一段 代码 执行结果为
  1. 调用完 innerA() 函数之后,x = 880
  2. 调用完 innerB() 函数之后,x = 250
  3. 调用完 innerC() 函数之后,x = 250
  4. 此时此刻,全局变量 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}") 改成

  1. print(f"调用完 innerC() 函数之后,x = {globals()['x']}")
复制代码


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

或者你在调用 innerC() 之后或之前可以把局部变量 x 删掉,就可以直接访问全局变量 x 了

  1.     innerC()
  2.     del x                            # 删掉局部变量 x
  3.     print(f"调用完 innerC() 函数之后,x = {x}")
复制代码

小甲鱼最新课程 -> https://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}") 改成

  1. print(f"调用完 innerC() 函数之后,x = {globals()['x']}")
复制代码


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

或者你在调用 innerC() 之后或之前可以把局部变量 x 删掉,就可以直接访问全局变量 x 了

  1.     innerC()
  2.     del x                            # 删掉局部变量 x
  3.     print(f"调用完 innerC() 函数之后,x = {x}")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-21 16:49:51 | 显示全部楼层
python新人见解:
应该是作用域的不同
nonlocal作用在函数里
global作用在函数外
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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