ad

打开《Python 编程与应用实践》_成为Python大佬_5.5 命名空间和作用域

网友投稿 127 2023-11-13

【摘要】 本书摘自《Python 编程与应用实践》一书中第5章,第5节,由冯伟森,王建,杨宁主编。

5.5 命名空间和作用域

5.5.1 作用域

命名空间是名字和对象的映射,各个命名空间之间相互独立。在 Python 程序中创 建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间, 也被称为作用域。

Python 程序有各种各样的命名空间。每个程序的主要部分定义了全局作用域,在这 个全局作用域中的变量是全局变量。除了全局作用域外,每个函数调用还会创建一个局部 作用域。在Python 中并不是所有的语句块中都会产生作用域。只有当变量在Module (模 块)、Class (类)、def (函数)中定义的时候,才会有作用域的概念。在if-elif-else、

for-else 、while 、try-except\try-finally 等关键字的语句块中并不会产生作用域。

Python 的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问 的范围。在作用域中定义的变量一般只在作用域中有效。

打开《Python 编程与应用实践》_成为Python大佬_5.5 命名空间和作用域

5.5.2 作用域的类型

在Python 中,使用一个变量时并不严格要求预先声明它,但是在真正使用它之前, 它必须被绑定到某个内存对象(被定义、赋值);这种变量名的绑定将在当前作用域中引 入新的变量,同时屏蔽外层作用域中的同名变量。

(1)L(local) 局部作用域。

局部变量:包含在 def关键字定义的语句块中,即在函数中定义的变量。每当函数被 调用时都会创建一个新的局部作用域。Python 中也有递归,即自己调用自己,每次调用 都会创建一个新的局部命名空间。

在函数内部的变量声明,除非特别地声明为全局变量,否则均默认为局部变量。有些 情况需要在函数内部定义全局变量,这时可以使用 global 关键字来声明变量的作用域为 全局。

(2)E(enclosing) 嵌套作用域。

E也包含在 def 关键字中, E 和 L 是相对的,E 相对于更上层的函数而言也是L 。与 L的区别在于,对一个函数而言,L 是定义在此函数内部的局部作用域,而E 是定义在此 函数的上一层父级函数的局部作用域。主要是为了实现 Python 的闭包而增加的实现。

(3)G(global) 全局作用域。

在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件 顶层声明的变量具有全局作用域,从外部来看,模块的全局变量就是一个模块对象的 属性。

注意:全局作用域的作用范围仅限于单个模块文件内。

(4)B(built-in) 内置作用域。

系统内固定模块里定义的变量,如预定义在 builtin 模块内的变量。

5.5.3 变量名解析法则

搜索变量名的优先级:局部作用域>嵌套作用域>全局作用域>内置作用域。

LEGB法则:当在函数中使用未确定的变量名时, Python 会按照优先级依次搜索4个 作用域,以此来确定该变量名的意义。在第一处找到的地方停止。如果没有找到,则会发 出 NameError 错误。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:达人之路《Excel 管理信息处理与实践教程第二版——全面兼容2016》_2.1.5 认识单元格的引用
下一篇:实战之路《Excel 数据处理与分析实战宝典_第2版》_2.7 数据的导入与导出
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×