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