鱼C论坛

 找回密码
 立即注册
查看: 36|回复: 1

[已解决]python全局变量问题

[复制链接]
发表于 前天 14:24 | 显示全部楼层 |阅读模式

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

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

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

这条题目中的innerC函数是X=250,全局变量是X=250.
理解不了。
innerC使用了global是修改了全局变量,可是全局变量此刻是多少,为什么是250,而不是520呢?
最后的全局变量x=250,也是因为innerC这边使用了global而变化了吗?
最佳答案
前天 14:25
这个问题涉及到 Python 中的作用域和变量声明。我来帮你一步步分析:

首先,在 outter() 函数中,x = 880 定义的是一个局部变量,它属于 outter 的函数作用域。

现在来看三个内部函数:

  • innerA()x = 100 创建了一个新的局部变量,它不会影响 outter 中的 x,所以调用后 outterx 还是 880。
  • innerB() 使用 nonlocal x 声明要修改外层(即 outter)的 x,所以 x = 250 修改了 outterx,此时 outterx 变为 250。
  • innerC() 使用 global x 声明要修改全局作用域的 x,所以 x = 520 修改的是全局变量 x,而不是 outter 的局部变量 x。因此,调用后 outterx 仍然是 250,而全局变量 x 被设置为 520。


所以,最后的输出结果是:
  1. 调用完 innerA() 函数之后,x = 880
  2. 调用完 innerB() 函数之后,x = 250
  3. 调用完 innerC() 函数之后,x = 250
  4. 此时此刻,全局变量 x = 520
复制代码


你提到的“innerC函数是X=250,全局变量是X=250”可能是误解。实际上,在 innerC 中修改的是全局变量,但打印的是 outter 的局部变量,所以显示 250。而最后的全局变量是 520。

简单总结:
  • nonlocal 修改外层函数的变量
  • global 修改全局变量
  • 不加声明则创建新的局部变量


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 14:25 | 显示全部楼层    本楼为最佳答案   
这个问题涉及到 Python 中的作用域和变量声明。我来帮你一步步分析:

首先,在 outter() 函数中,x = 880 定义的是一个局部变量,它属于 outter 的函数作用域。

现在来看三个内部函数:

  • innerA()x = 100 创建了一个新的局部变量,它不会影响 outter 中的 x,所以调用后 outterx 还是 880。
  • innerB() 使用 nonlocal x 声明要修改外层(即 outter)的 x,所以 x = 250 修改了 outterx,此时 outterx 变为 250。
  • innerC() 使用 global x 声明要修改全局作用域的 x,所以 x = 520 修改的是全局变量 x,而不是 outter 的局部变量 x。因此,调用后 outterx 仍然是 250,而全局变量 x 被设置为 520。


所以,最后的输出结果是:
  1. 调用完 innerA() 函数之后,x = 880
  2. 调用完 innerB() 函数之后,x = 250
  3. 调用完 innerC() 函数之后,x = 250
  4. 此时此刻,全局变量 x = 520
复制代码


你提到的“innerC函数是X=250,全局变量是X=250”可能是误解。实际上,在 innerC 中修改的是全局变量,但打印的是 outter 的局部变量,所以显示 250。而最后的全局变量是 520。

简单总结:
  • nonlocal 修改外层函数的变量
  • global 修改全局变量
  • 不加声明则创建新的局部变量


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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