七、嵌套作用域的静态性

前面说过,函数内定义的变量局部只有在函数执行时有效,当函数退出后就不能再访问了,例如下列代码:

 def f():
x = 6
print x

当我们在交互方式下执行上述代码时,结果如下:


图11  局部变量的动态性

当我们在函数中引用局部变量时,完全合法。但是,一旦函数退出,再次引用函数内的局部变量就会出错。这是因为局部变量是动态分配的,当函数执行时为其分配临时内存,函数执行后马上释放。这反映出局部变量的动态性。但是当出现函数嵌套时,情况会有所变化。请看下列代码:

def f(  ):
    x = 8
    def f1(  ):
        print x
    return f1

我们在交互环境下执行上述代码,如:


图12  嵌套作用域的动态性

我们说明一下上面的代码。首先,我们在函数f)中定义了一个局部变量x和一个内部函数f1),最后将内部函数名作为返回值。注意,我们在内部函数f1)中引用了外部函数f)的局部变量。我们在命令提示符下调用函数f),并将返回值赋给printx,这时变量printx中实际上存放的是内部函数f1)的函数名f1。所以在命令行中输入printx)实际上就是在调用内部函数f1)。然后内部函数执行,并引用外部函数f)的局部变量x。这说明,发生函数嵌套后,如果内部函数引用了外部函数的局部变量,那么外部函数的局部变量将被静态存储,即当函数退出后,其局部变量所占内存也不会被释放。

八、小结

在本文中,我们为读者介绍了函数的嵌套。除了嵌套函数的定义外,我们详细解释了嵌套函数中变量的查找过程以及相关的四种作用域,然后后讲解多层嵌套函数的执行过程,最后说明了嵌套作用域的静态性。为了帮助读者理解本文内容,我们给出了大量示例代码,读者可以利用这些代码实际运行、分析,从而加深理解。

相关文章】

  • 循序渐进学Python:安装、使用与运行程序
  • 循序渐进学Python之数值类型
  • 循序渐进学Python:三种选择语句
  • 循序渐进学Python之循环语句
  • 循序渐进学Python之函数入门


评论关闭