python系列教程187

47 阅读3分钟

朋友们,如需转载请标明出处:blog.csdn.net/jiangjunsho…

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

现在到了深入学习一下LEGB查找法则中E这个字母的时候了。E这一层是新内容(是Python 2.2才增加的),它包括了任意嵌套函数内部的本地作用域。嵌套作用域有时也叫做静态嵌套作用域。

在增加了嵌套的函数作用域后,变量的查找法则变得稍微复杂了一些。一个引用(X)首先在本地(函数内)作用域查找变量名X;之后会在外层嵌套的函数中进行查找,从内到外查找;之后查找当前的全局作用域(模块文件);最后再查找内置作用域内(模块__builtin__)。全局声明将会直接从全局(模块文件)作用域进行搜索。

为了阐明上面的要点,让我们用一些真正的代码来说明。下面是一个嵌套函数作用域的例子。

X = 99              # Global scope name: not used

def f1():

    X = 88          # Enclosing def local

    def f2():

        print(X)    # Reference made in nested def

    f2()

f1()                # Prints 88: enclosing def local

首先,这是一段合法的Python代码。def是一个简单的可执行语句,可以出现在任意其他语句能够出现的地方,包括嵌套在另一个def之中。这里,嵌套的def在函数f1调用时运行;这个def生成了一个函数,并将其赋值给变量名f2,f2是f1的本地作用域内的一个本地变量。在此情况下,f2是一个临时函数,仅在f1内部执行的过程中存在(并且只对f1中的代码可见)。

但是,值得注意的是f2内部发生了什么。当打印变量x时,x引用了存在于函数f1整个本地作用域内的变量x的值。因为函数能够在整个def声明内获取变量名,通过LEGB查找法则,f2内的x自动映射到了f1的x。

这个嵌套作用域查找在外层嵌套的函数已经返回后也是有效的。例如,下面的代码定义了一个函数创建并返回了另一个函数。

def f1():

    X = 88

   def f2():

       print(X)     # Remembers X in enclosing def scope

   return f2        # Return f2 but don't call it

action = f1()       # Make,return function

action()            # Call it now: prints 88

在这个代码中,我们命名为f2的函数的调用动作的运行是在f1运行后发生的。f2记住了在f1中嵌套作用域中的x,尽管f1已经不处于激活状态。