面试题答案
一键面试func()
函数的返回值:- 首先,全局变量
a
初始值为5
。 - 在
func
函数中,使用global
关键字声明a
为全局变量,然后执行a = a + 10
,此时a
的值变为5 + 10 = 15
。 - 接着,将
a
的值赋给b
,即b = 15
。 - 在
inner
函数中,使用nonlocal
关键字声明b
为外部函数(func
函数)的局部变量,然后执行b = b * 2
,此时b
的值变为15 * 2 = 30
,并返回b
的值。 - 所以,
func()
函数的返回值是30
。
- 首先,全局变量
global
关键字的作用:- 在
func
函数中,global a
声明了a
是全局变量。这意味着在func
函数内对a
的赋值操作不是创建一个新的局部变量a
,而是直接修改全局作用域中的a
。如果没有global a
这一行,当执行a = a + 10
时,Python 会认为要创建一个新的局部变量a
,但由于在赋值前引用了a
(a + 10
),会导致UnboundLocalError
错误。
- 在
nonlocal
关键字的作用:- 在
inner
函数中,nonlocal b
声明了b
是外部函数(func
函数)的局部变量,而不是在inner
函数中创建一个新的局部变量b
。如果没有nonlocal b
这一行,当执行b = b * 2
时,Python 会认为要创建一个新的局部变量b
,但由于在赋值前引用了b
(b * 2
),会导致UnboundLocalError
错误。
- 在
- 命名空间和作用域的相互影响:
- 全局命名空间:包含全局变量
a
。在整个程序的生命周期内存在。 func
函数的局部命名空间:当func
函数被调用时创建,包含局部变量b
。当func
函数执行结束,这个局部命名空间被销毁,除非b
被返回或有其他方式被外部引用。由于使用了global a
,func
函数可以访问并修改全局命名空间中的a
。inner
函数的局部命名空间:当inner
函数被调用时创建。由于使用了nonlocal b
,inner
函数可以访问并修改func
函数局部命名空间中的b
。inner
函数不能直接访问全局命名空间中的变量,除非使用global
关键字声明。
- 全局命名空间:包含全局变量
综上所述,func()
函数返回 30
,global
和 nonlocal
关键字分别用于正确访问和修改全局变量与外部函数的局部变量,同时它们也体现了不同命名空间和作用域之间的关系。