schneider 发表于 2022-9-9 21:03:43

求大佬指教,为什么结果会这样

第一个结果不应该是 100,第二个是250,第三个是520么?

Twilight6 发表于 2022-9-9 21:19:21



最开始 x = 880 是在函数内赋值初始化的,属于局部变量,此时全局作用域没有 x 变量

但在 global 声明后,函数 outter() 外的全局作用域中就新添了一个 x = 520

但新添了 x = 520 这个全局变量,不会覆盖在函数 outter() 中的局部变量 x = 250

所以在 outter 中打印的 x 即属于 outter 中的局部变量 x ,而不是 innerC 函数中声明的全局变量 x

临时号 发表于 2022-9-9 21:22:00

innerA函数中的x变量只是innerA函数中的一个局部变量,只在函数内部有效,所以在innerA函数中修改x的值为100只是将局部变量x修改为100,而outter函数中的局部变量x的值还是880

innerB函数中的x变量被nonlocal关键字声明为outter函数中的一个局部变量,所以在innerB函数中修改x的值为250是将outter中局部变量x修改为250,所以输出了250

innerC函数中的x变量被global关键字声明为一个全局变量,所以在innerC函数中修改x的值为520是将全局变量x修改为520,但由于在outter函数中对x进行了修改,所以在outter函数中的x变量实际是outter函数中的局部变量x,所以x的值仍然为250

wp231957 发表于 2022-9-9 21:22:10

此x非彼x

schneider 发表于 2022-9-10 01:26:53

Twilight6 发表于 2022-9-9 21:19
最开始 x = 880 是在函数内赋值初始化的,属于局部变量,此时全局作用域没有 x 变量

但在 global 声 ...

额,我还是不理解,执行的顺序是从上到下的,执行完innerA应该是100的,然后nonlocal又会修改def innnerA的结果,那么这个代码执行的顺序到底是怎么样的。。。。。

schneider 发表于 2022-9-10 01:27:30

wp231957 发表于 2022-9-9 21:22
此x非彼x

额。。。

schneider 发表于 2022-9-10 01:29:16

临时号 发表于 2022-9-9 21:22
innerA函数中的x变量只是innerA函数中的一个局部变量,只在函数内部有效,所以在innerA函数中修改x的值为100 ...

谢谢,前两个理解了,但是最后这个innerC有一点不懂,我在思考一下,谢谢!

schneider 发表于 2022-9-10 01:29:56

Twilight6 发表于 2022-9-9 21:19
最开始 x = 880 是在函数内赋值初始化的,属于局部变量,此时全局作用域没有 x 变量

但在 global 声 ...

谢谢!

Twilight6 发表于 2022-9-10 08:23:05

schneider 发表于 2022-9-10 01:26
额,我还是不理解,执行的顺序是从上到下的,执行完innerA应该是100的,然后nonlocal又会修改def innnerA ...


函数调用先后 outter() -> innerA() -> innerB() -> innerC(),主要是要理解局部变量和全局变量,当全局作用域有变量时

在局部进行同变量名全局变量的赋值此时就会暂时屏蔽这个全局变量,例如这里 innerA() 中 x = 100

此时会屏蔽相对 innerA 函数为全局空间的 x = 880 变量,在 函数 innerA 中,x 都等于 100 ,而不是 880

而回到 outter() 函数时,x 还是 880,因为在 innerA 中创建的只是局部变量,不会对这个外部的 x 进行改变

除非像 innerB 那样,声明了 nonlocal 这个变量不是局部的,那么就会将 x = 880 更改为 x = 250

最后 innerC 函数中,因为在你调用 outter() 函数前,这个程序没有 x 被初始化

所以此时你 global 声明了 innerC 函数中的 x 变量属于全局作用域的全局变量,就相当于在 outter 函数外部,即整个程序全局作用域中,设置了 x = 520,此时在 innerC 和 outter 函数外,x 都为 520

此时 x = 880 和 x = 520 的情况,就相当于最开始 innerA 和 outter 函数的情况,x = 880 是局部变量,而 520 是全局变量,在 outter 函数中,暂时屏蔽了 x = 520 这个全局变量


这样解释能更好的理解吗?


schneider 发表于 2022-9-10 16:10:29

Twilight6 发表于 2022-9-10 08:23
函数调用先后 outter() -> innerA() -> innerB() -> innerC(),主要是要理解局部变量和全局变量,当 ...

理解了,非常感谢!!!
页: [1]
查看完整版本: 求大佬指教,为什么结果会这样