强基初中数学&学Python——第二十六课 作用域与名字空间

    用一个含内层函数的函数来测试。

    只定义全局变量的程序和结果:

    增加定义函数局部变量的程序和结果:

    增加定义内层函数局部变量的程序和结果:

    变量的访问(在等号右边),取值由里到外寻找。

    请看下面的程序与运行结果:

本来想先打印出函数的局部变量后改变var的值,但第一次打印都无法执行,显示变量"var”还没定义,这是为什么呢?

    解释:内层函数在第一次打印的语句后才定义var,在第一次打印时var还没定义,Python解释器也不会到函数(test)层寻找变量的值,所以就抛出错误了。

    内层函数、函数和整个模块(文件)它们的变量可以同一个名词,但泾渭分明,如同处在不同的空间,Python中就把这些叫做命名空间。命名空间可以镶套,但绝不相混。

    这个例子充分说明了Python命名空间的工作原理:一个空间内的命名不分先后,代码执行分先后;空间内有的命名,即使还没执行定义代码也不会到外层空间寻找,从而抛出错误。

    从上面的例子也可以得到:全局变量整篇代码可被访问;函数局部变量在函数和内镶函数内可以被访问;内镶函数变量只能在内镶函数内被访问。如果把代码当作地盘,就是地盘越来越小了。这种“代码地盘”就是变量的作用域。

    为了不在内层函数命名空间内重新命名var,就得使用nonlocal关键字显式标注变量。

    程序1及其结果打印:

    程序2及其结果打印:

    nonlocal关键字不适合全局变量,这就要用global 关键字了。

    程序及结果打印:

练习题:把本课的测试输入电脑,自己测试一次。