马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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呢
你也说了,调用 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}")
|