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 代码结果分析

    

原文地址:https://www.cnblogs.com/cuizhu/p/9464109.html

时间: 2024-10-20 06:19:17

python——作用域之LEGB规则的相关文章

【Python】 命名空间与LEGB规则

命名空间与LEGB规则 之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样. ■ 命名空间 所谓命名空间,就是指根据代码区域的不同而对变量名做出的划分,在一个命名空间中往往会有一定的变量名和变量内容的对应关系.在值语义的语言中,变量名往往是变量所指代内容在内存中地址的别称,但是在python中,变量名本身就是一个字符串对象,命名空间只不过是把这个字符串对象和对象对应了起来.进一步来说,其实在

python作用域和多继承

python作用域 python无块级作用域 看c语言代码: #include<stdio.h> int main() { if(2 > 0) { int i = 0; } printf("i = %d", i); return 0; } 在这段代码中,if子句引入了一个局部作用域,变量i就存在于这个局部作用域中,但对外不可见,因此,接下来在printf函数中对变量i的引用会引发编译错误,但是在python中并非如此 看下面代码: if 1 == 1: name =

LEGB规则

LEGB规则 Python使用LEGB的顺序来查找一个符号对应的对象 local -> enclosing function -> global -> builtins locals,当前所在命名(如函数,模块),函数的参数也属于命名空间内的变量 enclosing,外部嵌套函数的命名空间(闭包中常见) def fun1(): a = 10 def fun2(): #a 位于外部嵌套的命名空间 print(a) gloables,全局变量,函数定义所在模块的命名空间 a = 1 def

Python 作用域和命名空间

Python Scopes and Namespaces A namespace is a mapping from names to objects. 命名空间是一个从名字到对象的映射(指向,明确的路径). Most namespaces are currently implemented as Python dictionaries. 大部分都是由字典dict(其他语言也称为hash)实现. 例子: the set of built-in names .放置内置函数的集合.模块中的全局名称:

day10 Python作用域 Python2.7与Python3.x的类继承的区别及其他

一.Python作用域   1.Python中无块级作用域 if 1 == 1: name = 'test' print(name) #输出会报错,因为name的作用域仅限于if下的代码块,而不属于全局   2.Python中以函数为作用域 def func(): func_name = 'func_test' print(func_name) #这里同样会报错,因为变量func_name的作用于func函数中   3.Python作用域链,层层嵌套,使用时从内向外找   4.Python的作用

[js]作用域链查找规则获取值和设置值

作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到window为止,如果window也没有了? 1)如果是获取值,则报错 2)如果是设置值,则相当于给window设置了一个属性 2.js代码一旦报错,则不往下执行了. */ function fn() { console.log(total); //获取值 total = 100; //设置值 } fn(); cons

Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") return test1 res = test() print(res) 输出结果 test <function test1 at 0x021F5C90> 分析:这里print(res)输出的是te

Python作用域的规则小析

Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))的规则进行操作的.这看起来很直观,对吧?事实上,在Python中这有一些细微的地方很容易出错.看这个例子:12345678910 >>> x = 10>>> def foo():... x += 1... print x...>>> foo()Traceback (most recent call last): F

飘逸的python - 作用域与lookup策略

首先了解什么是命名空间,命名空间是一个"命名->对象"的映射,在python中用dict实现的. 而作用域,是指能直接访问到的命名空间. 当我们访问一个变量时,会按LEGB的顺序来lookup: L->Local. 即局部变量,比如定义在def或lambda中的变量. E-> Enclosing function locals. 即闭包中的变量. G->Global (module).全局变量. B->Built-in .内置变量,比如len()/KeyE