大佬帮忙看一看
本帖最后由 wang1313131313 于 2023-3-27 18:09 编辑请用legb原则解释一下或者讲一下为啥结果是那几个,谢谢{:10_266:}
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"。
首先,spcetest里spam是testspam
然后local只改了local里的局部变量,所以local函数等于空函数,忽略,输出testspam
nonlocal会改变上层函数(spocetest),spam改为nonlocalspam,输出
global函数里直接改变全局变量,可是sopcetest里并没有将spam设为全局变量,程序先访问局部变量spam“nonlocalspam”
最后函数外:函数里的spam消失(因为退出函数),但是doglobal里设了全局变量是“globalspam”,所以输出globa spam 歌者文明清理员 发表于 2023-3-27 18:11
首先,spcetest里spam是testspam
然后local只改了local里的局部变量,所以local函数等于空函数,忽略,输 ...
感谢 wang1313131313 发表于 2023-3-27 18:11
感谢
最佳答案{:10_254:}
(拼写错误…呃…) 歌者文明清理员 发表于 2023-3-27 18:12
最佳答案
(拼写错误…呃…)
为啥 ’local函数等于空函数‘ ? 没有理解到,麻烦解释一下,谢谢 wang1313131313 发表于 2023-3-27 18:16
为啥 ’local函数等于空函数‘ ? 没有理解到,麻烦解释一下,谢谢
因为dolocal没有改变任何东西。dolocal函数里的“spam”没有被使用,并且缺少声明(默认dolocal函数里的局部),所以spam是局部;出了函数就没了,且dolocal函数里没别的了,就相当于啥也没干(实际上不是,它定义了一个局部变量,但没有输出,用户啥也没看到,就你的例子而言可以忽略) isdkz 发表于 2023-3-27 18:17
1、首先,我们定义了一个名为scope_test的函数,它包含三个内部函数:do_local、do_nonlocal和do_global ...
有点没有理解do_global的解释,这个函数整体不是没有全局变量吗,全局变量不是函数外设定的变量吗 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变量。 wang1313131313 发表于 2023-3-27 20:09
是不是可以这样理解,spam='test spam'是do_那几个函数的全局变量,是scope_test的局部变量
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量 isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量
好的 isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量
当do_nonlocal()函数执行结束后,其局部变量spam也会在此作用域内消失吗?和do_local一样 wang1313131313 发表于 2023-3-27 20:31
当do_nonlocal()函数执行结束后,其局部变量spam也会在此作用域内消失吗?和do_local一样
不会,因为nonlocal声明修改的是它的外围作用域的,也就是scope_test函数的作用域 isdkz 发表于 2023-3-27 20:14
不能这么理解,spam='test spam'只能算是do_那几个函数的外围变量
请问这个正确吗,其实这几个do函数最后打印得都是scope 下的spam=“test…”,只不过do函数中,如dononlocal 通过用nonlocal 将spam=“test…”换成了spam=“nonlocal…..” wang1313131313 发表于 2023-3-27 20:40
请问这个正确吗,其实这几个do函数最后打印得都是scope 下的spam=“test…”,只不过do函数中,如dononloc ...
对的,因为print函数是在 scope_test 这个命名空间的,所以在 scope_test 里面能找到 spam 就不会往全局找,找不到才往全局找 isdkz 发表于 2023-3-27 20:35
不会,因为nonlocal声明修改的是它的外围作用域的,也就是scope_test函数的作用域
为什么local的局域变量会消失呢,和nonlocal 的局域变量有啥区别 以及怎样判别局域变量是否消失(局域变量不应该是函数运行完后就消失了吗,nonlocal不能这样认为吗) wang1313131313 发表于 2023-3-27 20:51
为什么local的局域变量会消失呢,和nonlocal 的局域变量有啥区别 以及怎样判别局域变量是否消失(局域变 ...
一个函数结束,局部变量的生命周期就结束了呀,nonlocal 的变量是在 scope_test 里面的,只要 scope_test 这个函数运行结束,nonlocal 的那个变量生命周期也一样会跟着结束的,只不过是 print 是在 scope_test 函数里面进行的,所以肯定要运行完 print 之后 scope_test 才会结束呀
页:
[1]