作用域

Posted juno3550

tags:

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

1. 什么是命名空间

2. globals、locals

3. LEGB 规则

 

 

1. 什么是命名空间

我们在编写 Python 程序的过程中,如果要使用变量和函数,都需要先对变量和函数命名后才能使用。Python 会把命名后的变量和函数分配到不同的命名空间,并通过名称来识别它们。

Python为什么要区分不同的命名空间呢?它有两个作用:一个作用是不同的命名空间对应不同的作用域;另外一个作用是防止命名冲突。

 

2. globals、locals

在提到变量的作用域时,经常提到局部变量和全局变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域。

技术图片

 

3. LEGB 规则

Python 使用 LEGB 的顺序来查找一个符号对应的对象:

locals -> enclosing function -> globals -> builtins

locals

当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量。

enclosing

外部嵌套函数的命名空间(闭包中常见)。

1 def fun1():
2   a = 10
3   def fun2():
4       # a 位于外部嵌套函数的命名空间
5       print(a)

globals

全局变量,函数定义所在模块的命名空间。

1 a = 1
2 def fun():
3   # 需要通过 global 指令来声明全局变量
4   global a
5   # 修改全局变量,而不是创建一个新的 local 变量
6   a = 2

builtins

内建模块的命名空间。

Python 在启动的时候会自动为我们载入很多内建的函数、类,比如 dict,list,type,print,这些都位于 __builtin__ 模块中,可以使用 dir(__builtin__) 来查看。

在 Python 启动后,且没有执行程序员所写的任何代码前,Python 会首先加载该内建函数到内存。这也是为什么我们在没有 import 任何模块的情况下,就能使用这么多丰富的函数和功能了。

另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,其原因是对函数、变量、类等标识符的查找是按 LEGB 法则,其中 B 即代表内建模块。

比如:内建模块中有一个 abs() 函数,其功能求绝对值,如 abs(-20) 将返回 20。

 

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

JS 作用域及作用域链

作用域是什么?

JavaScript 作用域 与 作用域链

JS---闭包

angularjs作用域之transclude

Python - 模块