黑猫小肥 发表于 2023-3-21 16:25:39

45讲 课后题 问题求助

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呢

isdkz 发表于 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}")

jhq999 发表于 2023-3-21 16:49:51

python新人见解:
应该是作用域的不同
nonlocal作用在函数里
global作用在函数外
页: [1]
查看完整版本: 45讲 课后题 问题求助