python系列教程187——嵌套作用域
Posted 人工智能AI技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python系列教程187——嵌套作用域相关的知识,希望对你有一定的参考价值。
朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些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已经不处于激活状态。
以上是关于python系列教程187——嵌套作用域的主要内容,如果未能解决你的问题,请参考以下文章