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