循序渐进学Python之函数的嵌套(1)


51CTO独家特稿】我们在上一篇文章即“循序渐进学Python之函数入门”中介绍了函数的定义和调用方法,那里定义的函数都是相互平行的,也就是说,所有函数都是在其它函数之外定义的。而本文介绍的是函数的嵌套:即函数内部的函数。我们这里首先介绍了嵌套函数的定义,以及嵌套函数中变量的查找过程,然后后讲解多层嵌套函数的执行过程,最后说明了嵌套作用域的静态性。

一、函数的嵌套定义

学习过C语言的读者都知道,C语言的函数定义都是相互独立的,也就是说,在定义函数的时候,不能在这个函数内部包含其它函数的定义。但是Python语言正好与之相反,它允许在定义函数的时候,其函数体内又包含另外一个函数的完整定义,这就是我们通常所说的嵌套定义。为什么?因为函数是用def语句定义的,凡是其他语句可以出现的地方,def语句同样可以出现。
像这样定义在其他函数内的函数叫做内部函数,内部函数所在的函数叫做外部函数。当然,我们可以多层嵌套,这样的话,除了最外层和最内层的函数之外,其它函数既是外部函数又是内部函数。

下面是一个内部函数的例子:

def f():
char='hello'
def f1():
print char
f1()

上面的定义在交互方式下的运行情况如下所示:


图1  函数的嵌套定义

二、嵌套函数的作用域

内部函数定义的变量只在内部有效,包括其嵌套的内部函数,但是对外部函数无效,如下例所示:

def f():
def f1():
x=3
print '''目前在函数f1)中:x=''', x
def f2():
print '''目前在函数f2)中:x=''', x
f2()
f1()

对于上面的代码,我们定义了三个函数,其中函数f)是函数f1)的外部函数,而函数f1)又是函数f2)的外部函数。在这三个函数中我们仅定义了一个变量x,并且该变量是在函数f1)中定义的,然后我们分别在函数f1)和它的内部函数f2)中打印该变量的值。在交互式环境下的执行情况如下所示:


 图2  内部函数可以使用外部函数的变量

上图说明内部函数可以引用外部函数中定义的变量,但是外部函数却不能引用内部函数定义的变量,例如:

def f():
x=6
def f1():
y=18
print '''目前在内部函数f1)中:'''
print 'x=',x,'y=',y
f1()
print '''目前在外部函数f2)中:'''
print 'x=',x,'y=',y

在上面的示例代码中,我们在外部函数f)中定义了一个变量x,然后又在内部函数f1)中定义了一个变量y;然后分别在内部函数和外部函数中引用这两个变量,代码的交互式执行情况如下所示:


图3  外部函数不可以使用内部函数的变量

很明显,程序在引用内部变量的时候出错了,因为内部函数定义的变量只对这个函数本身及其内部函数可见,而不对其外部函数可见,所以在外部函数f)看来,变量y尚未定义。


评论关闭