|
发表于 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"。
|
|