caeser 发表于 2023-2-15 14:00:38

第45讲函数第3题调用完 innerC() 后,x为什么是250?

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}")

def innerC():
      global x
      x = 520
这里已经声明 x 是全局变量了,可为什么最后结果是250啊?

linke.zhanghu 发表于 2023-2-15 14:06:09

你没有定义全局变量啊
你的x=880也不是全局,而是函数fucter中的局部变量。你用global声明没有意义啊

linke.zhanghu 发表于 2023-2-15 14:09:15

本帖最后由 linke.zhanghu 于 2023-2-15 14:28 编辑

不是没有意义,如果你不声明的话可能会直接报错。
直接把x=880定义到全局里面不要定义在函数内部即可

isdkz 发表于 2023-2-15 14:29:16

因为你之前已经定义过局部变量 x 了,你直接用 x 优先访问到的是局部变量,你应该用 globals()['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 = {globals()['x']}")               # 注意这里
   
outter()
print(f"此时此刻,全局变量 x = {x}")
页: [1]
查看完整版本: 第45讲函数第3题调用完 innerC() 后,x为什么是250?