前面所看到的函数都是全局范围内定义的,他们都是全局函数。python还支持在函数体内定于函数,这种被放在函数体内定义的函数称为局部函数
在默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭(enclosing)函数内有效,其封闭函数也可以返回局部函数,以便程序在其他作用域中使用局部函数。
>>> def ca(type,nn): def square(n): return n*n def cube(n): return n*n*n def fac(n): result=1 for i in range(2,n+1): result *=i return result if type == 'square': return square(nn) elif type == 'cube': return cube(nn) else: return fac(nn) >>> ca('square',3) 9 >>> ca('cube',3) 27
>>> ca('',3)
6
>>> ca('',4)
24
>>> ca('3',3)
6
局部函数内的变量也会遮蔽它所在函数内的局部变量:
>>> def foo(): name='bob' def bar(): print(name) name='jeff' bar() >>> foo() Traceback (most recent call last): File "<pyshell#174>", line 1, in <module> foo() File "<pyshell#173>", line 6, in foo bar() File "<pyshell#173>", line 4, in bar print(name) UnboundLocalError: local variable 'name' referenced before assignment
python提供了nonlocal关键字,通过nonlocal语句即可声明访问赋值语句只是访问该函数所在函数的局部变量。
>>> def foo(): name='bob' def bar(): nonlocal name print(name) name='jeff' bar() >>> foo() bob
nonlocal和global功能大致相似,区别只是global用于声明全局变量,而nonlocal用于声明当前函数所在函数的局部变量