python——作用域之LEGB规则

Posted 翠竹09

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python——作用域之LEGB规则相关的知识,希望对你有一定的参考价值。

1 变量的作用域

  Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式。

2 LEGB各自代表的含义

  2.1  L-Local
    函数内的命名空间。作用范围:当前整个函数体范围。

  2.2 E-Enclosing function locals
    外部嵌套函数的命名空间。作用范围:闭包函数。

  2.3 G-Global
    全局命名空间。作用范围:当前模块(文件)。
  2.4 B-Builtin
    内建模块命名空间。作用范围:所有模块(文件)。

  注意:Python中没有块级作用域。块级作用域,代码块中的变量,比如 if while for 后的代码。

3 LEGB规则
  LEGB规则就是按照 L->E->G->B的顺序进行查找变量。也就说,当不同命名空间具有相同变量名称的变量时,我们首先查找局部变量,如果没查到,再向全局变量查找。

4 基于命名空间的常见变量类型

  4.1 局部变量

    在一个函数内部定义的变量。作用域为函数内部。查看局部变量命令:locals()。

 

  4.2 全局变量

    在函数外部,文件最外层定义的变量。作用域为整个文件内部。查看全局变量命令:globals()


  4.3 注意
    变量访问原则:从内到外。全局变量和局部变量重名时,采用就近原则。

 

4 案例讲解

  4.1 代码如下

 1 a = "G全局"                         # 定义了一个全局变量a,并把"G全局"赋值给a
 2 def myfunc():
 3     a = "E局部1"                    # 定义了一个局部变量a,并把"E局部1"赋值给a
 4 
 5     def inner():
 6          a = "L局部2"                # 定义了一个局部变量a,并把"E局部1"赋值给a
 7          print("inner打印的a:", a)   
 8     inner()
 9     print("myfunc打印的a:", a)
10 
11 
12 myfunc()
13 print("__main__打印的a:", a)

 

   4.2 代码执行结果

    

 

  4.3 代码结果分析

    

 

以上是关于python——作用域之LEGB规则的主要内容,如果未能解决你的问题,请参考以下文章

Python中的LEGB规则

Python 命名空间与LEGB规则

angularjs作用域之transclude

python中对变量的作用域LEGB闭包装饰器基本理解

Python 变量作用域 LEGB

[转]nonlocal和global