鱼C论坛

 找回密码
 立即注册
查看: 1797|回复: 16

[已解决]大佬帮忙看一看

[复制链接]
发表于 2023-3-27 18:04:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wang1313131313 于 2023-3-27 18:09 编辑

屏幕截图 2023-03-27 180044.png    请用legb原则解释一下或者讲一下为啥结果是那几个,谢谢
最佳答案
2023-3-27 18:17:58

1、首先,我们定义了一个名为scope_test的函数,它包含三个内部函数:do_local、do_nonlocal和do_global。
2、在scope_test函数中,我们定义了一个名为spam的变量,并将其值设置为"test spam"。

接下来,我们依次调用这三个内部函数并在每次调用后打印spam的值:

3、调用do_local():

  • 在do_local()函数中,我们定义了一个局部变量spam,并将其值设置为"local spam"。
  • 当do_local()函数执行结束后,局部变量spam会在此作用域内消失。因此,在scope_test函数的作用域中,spam的值仍然是"test spam"。
  • 所以,当我们打印"After local assignment:"时,输出的值是"test spam"。



4、调用do_nonlocal():

  • 使用nonlocal关键字,我们告诉解释器我们要引用的是spam变量的一个外围作用域中的版本,而不是在do_nonlocal()函数内定义一个新的局部变量。
  • 在这个例子中,外围作用域是scope_test函数的作用域。我们将spam的值更改为"nonlocal spam"。
  • 当我们打印"After nonlocal assignment:"时,输出的值是"nonlocal spam",因为我们已经更改了scope_test函数作用域中的spam变量。


5、调用do_global():

  • 使用global关键字,我们告诉解释器我们要引用的是全局作用域中的spam变量,而不是在do_global()函数内定义一个新的局部变量。
  • 我们将全局变量spam的值更改为"global spam"。
  • 请注意,这里我们并没有更改scope_test函数作用域中的spam变量,而是更改了全局作用域中的变量。
  • 所以,当我们打印"After global assignment:"时,输出的值仍然是"nonlocal spam",因为scope_test函数作用域中的spam变量没有被更改。


6、最后,我们在全局作用域中调用scope_test()函数并打印"In global scope:":

  • 因为我们在do_global()函数中将全局变量spam的值更改为"global spam",所以在全局作用域中,spam的值是"global spam"。
  • 所以,当我们打印"In global scope:"时,输出的值是"global spam"。

屏幕截图 2023-03-27 180835.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-27 18:17:58 | 显示全部楼层    本楼为最佳答案   

1、首先,我们定义了一个名为scope_test的函数,它包含三个内部函数:do_local、do_nonlocal和do_global。
2、在scope_test函数中,我们定义了一个名为spam的变量,并将其值设置为"test spam"。

接下来,我们依次调用这三个内部函数并在每次调用后打印spam的值:

3、调用do_local():

  • 在do_local()函数中,我们定义了一个局部变量spam,并将其值设置为"local spam"。
  • 当do_local()函数执行结束后,局部变量spam会在此作用域内消失。因此,在scope_test函数的作用域中,spam的值仍然是"test spam"。
  • 所以,当我们打印"After local assignment:"时,输出的值是"test spam"。



4、调用do_nonlocal():

  • 使用nonlocal关键字,我们告诉解释器我们要引用的是spam变量的一个外围作用域中的版本,而不是在do_nonlocal()函数内定义一个新的局部变量。
  • 在这个例子中,外围作用域是scope_test函数的作用域。我们将spam的值更改为"nonlocal spam"。
  • 当我们打印"After nonlocal assignment:"时,输出的值是"nonlocal spam",因为我们已经更改了scope_test函数作用域中的spam变量。


5、调用do_global():

  • 使用global关键字,我们告诉解释器我们要引用的是全局作用域中的spam变量,而不是在do_global()函数内定义一个新的局部变量。
  • 我们将全局变量spam的值更改为"global spam"。
  • 请注意,这里我们并没有更改scope_test函数作用域中的spam变量,而是更改了全局作用域中的变量。
  • 所以,当我们打印"After global assignment:"时,输出的值仍然是"nonlocal spam",因为scope_test函数作用域中的spam变量没有被更改。


6、最后,我们在全局作用域中调用scope_test()函数并打印"In global scope:":

  • 因为我们在do_global()函数中将全局变量spam的值更改为"global spam",所以在全局作用域中,spam的值是"global spam"。
  • 所以,当我们打印"In global scope:"时,输出的值是"global spam"。

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

使用道具 举报

发表于 2023-3-27 18:11:12 | 显示全部楼层
首先,spcetest里spam是testspam
然后local只改了local里的局部变量,所以local函数等于空函数,忽略,输出testspam
nonlocal会改变上层函数(spocetest),spam改为nonlocalspam,输出
global函数里直接改变全局变量,可是sopcetest里并没有将spam设为全局变量,程序先访问局部变量spam“nonlocalspam”
最后函数外:函数里的spam消失(因为退出函数),但是doglobal里设了全局变量是“globalspam”,所以输出globa spam
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 18:11:35 | 显示全部楼层
歌者文明清理员 发表于 2023-3-27 18:11
首先,spcetest里spam是testspam
然后local只改了local里的局部变量,所以local函数等于空函数,忽略,输 ...

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

使用道具 举报

发表于 2023-3-27 18:12:47 | 显示全部楼层

最佳答案
(拼写错误…呃…)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 18:16:39 | 显示全部楼层
歌者文明清理员 发表于 2023-3-27 18:12
最佳答案
(拼写错误…呃…)

为啥 ’local函数等于空函数‘ ? 没有理解到,麻烦解释一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 18:18:18 | 显示全部楼层
wang1313131313 发表于 2023-3-27 18:16
为啥 ’local函数等于空函数‘ ? 没有理解到,麻烦解释一下,谢谢


因为dolocal没有改变任何东西。dolocal函数里的“spam”没有被使用,并且缺少声明(默认dolocal函数里的局部),所以spam是局部;出了函数就没了,且dolocal函数里没别的了,就相当于啥也没干(实际上不是,它定义了一个局部变量,但没有输出,用户啥也没看到,就你的例子而言可以忽略)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 20:05:37 | 显示全部楼层
isdkz 发表于 2023-3-27 18:17
1、首先,我们定义了一个名为scope_test的函数,它包含三个内部函数:do_local、do_nonlocal和do_global ...

有点没有理解do_global的解释,这个函数整体不是没有全局变量吗,全局变量不是函数外设定的变量吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:13:25 | 显示全部楼层
wang1313131313 发表于 2023-3-27 20:05
有点没有理解do_global的解释,这个函数整体不是没有全局变量吗,全局变量不是函数外设定的变量吗

在do_global()函数中,global spam指示解释器将要操作的spam变量是全局作用域中的变量。如果全局作用域中不存在该变量,它将在全局作用域中创建一个新的变量。然后,spam = "global spam"这行代码将全局变量spam的值设置为"global spam"。

在scope_test()函数中调用do_global()函数时,它会在全局作用域中创建一个新的变量spam(如果之前没有创建过),并将其值设置为"global spam"。请注意,这不会影响scope_test()函数内部的spam变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:14:44 | 显示全部楼层
wang1313131313 发表于 2023-3-27 20:09
是不是可以这样理解,spam='test spam'是do_那几个函数的全局变量,是scope_test的局部变量

不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 20:15:50 | 显示全部楼层
isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量

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

使用道具 举报

 楼主| 发表于 2023-3-27 20:31:25 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量

当do_nonlocal()函数执行结束后,其局部变量spam也会在此作用域内消失吗?和do_local一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:35:15 | 显示全部楼层
wang1313131313 发表于 2023-3-27 20:31
当do_nonlocal()函数执行结束后,其局部变量spam也会在此作用域内消失吗?和do_local一样

不会,因为nonlocal声明修改的是它的外围作用域的,也就是scope_test函数的作用域
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 20:40:01 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量

请问这个正确吗,其实这几个do函数最后打印得都是scope 下的spam=“test…”,只不过do函数中,如dononlocal 通过用nonlocal 将spam=“test…”换成了spam=“nonlocal…..”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:43:09 | 显示全部楼层
wang1313131313 发表于 2023-3-27 20:40
请问这个正确吗,其实这几个do函数最后打印得都是scope 下的spam=“test…”,只不过do函数中,如dononloc ...

对的,因为print函数是在 scope_test 这个命名空间的,所以在 scope_test 里面能找到 spam 就不会往全局找,找不到才往全局找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 20:51:54 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-27 20:35
不会,因为nonlocal声明修改的是它的外围作用域的,也就是scope_test函数的作用域

为什么local的局域变量会消失呢,和nonlocal 的局域变量有啥区别 以及怎样判别局域变量是否消失(局域变量不应该是函数运行完后就消失了吗,nonlocal不能这样认为吗)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:56:28 | 显示全部楼层
wang1313131313 发表于 2023-3-27 20:51
为什么local的局域变量会消失呢,和nonlocal 的局域变量有啥区别 以及怎样判别局域变量是否消失(局域变 ...

一个函数结束,局部变量的生命周期就结束了呀,nonlocal 的变量是在 scope_test 里面的,只要 scope_test 这个函数运行结束,nonlocal 的那个变量生命周期也一样会跟着结束的,只不过是 print 是在 scope_test 函数里面进行的,所以肯定要运行完 print 之后 scope_test 才会结束呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 03:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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