鱼C论坛

 找回密码
 立即注册
查看: 2426|回复: 9

[已解决]求大佬指教,为什么结果会这样

[复制链接]
发表于 2022-9-9 21:03:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第一个结果不应该是 100,第二个是250,第三个是520么?
最佳答案
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 这个全局变量


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


1662728473454.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-9 21:19:21 | 显示全部楼层


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

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-9 21:22:10 From FishC Mobile | 显示全部楼层
此x非彼x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

但在 global 声 ...

额,我还是不理解,执行的顺序是从上到下的,执行完innerA应该是100的,然后nonlocal又会修改def innnerA的结果,那么这个代码执行的顺序到底是怎么样的。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-10 01:27:30 | 显示全部楼层

额。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-10 01:29:16 | 显示全部楼层
临时号 发表于 2022-9-9 21:22
innerA函数中的x变量只是innerA函数中的一个局部变量,只在函数内部有效,所以在innerA函数中修改x的值为100 ...

谢谢,前两个理解了,但是最后这个innerC有一点不懂,我在思考一下,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

但在 global 声 ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 这个全局变量


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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

理解了,非常感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表