在 Python 程序中创建、改变或查找变量名时,都是在一个保存变量名的地方进行中,那个地方我们称之为命名空间。作用域这个术语也称之为命名空间。 具体地说,在代码中变量名被赋值(Python 中变量声明即赋值,global 声明的只是变量的使用域)的位置决定了该变量能被访问的范围。函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域之前有如下关系:

  • 每一个模块都是全局作用域。也就是说,创建于模块文件顶层的变量具有全局作用域,对于外部访问就成了一个模块对象的属性。
  • 全局作用域的作用范围仅限于单个文件。“全局”指的是在一个文件的顶层变量名对于这个文件而言是全局的。
  • 每次对函数的调用都创建了一个新的本地作用域。Python 中也有递归,即可以调用自身,每次调用都会创建五个新的本地命名空间。
  • 赋值的变量名除非声明为全局变量,否则均为本地变量。如果需要在函数内部对模块文件顶层的变量名赋值,需要在函数内部通过 global 语句声明该变量。
  • 所有的变量可归纳为本地、全局或者内置三种。范围分别为 def 内部,在一个模块的命名空间内部和预定义的 __builtin__ 模块提供的变量。

变量名解析:LEGB 原则

如果对以上内容有所迷惑的话,请看以下总结出的几条原则。在函数命名空间中:

  • 变量名引用分为三个作用域进行查找:首先是本地,然后是函数内(如果有的话),之后是全局,最后是内置。
  • 在默认情况下,变量名赋值会创建或者改变本地变量。
  • 全局声明将会给映射到模块文件内部的作用域的变量名赋值。
  • Python 的变量名解析机制也称为 LEGB 法则,具体如下: 当在函数中使用未确定的变量名时,Python 搜索 4 个作用域:本地作用域(L),之后是上一层嵌套结构中 def 或 lambda 的本地作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按这个查找原则,在第一处找到的地方停止。如果没有找到,Python 会报错的。
  • 下图说明了搜索流程(由内及外):

作用域实例

# -*- coding: utf8 -*- # 全局作用域 x = 99 # x 和 func 函数在模块中声明,为全局使用域 def func(y): # 本地作用域 z = x + y # x 为全局变量 return z func(1) # func 在模块中定义,可以调用.结果=100

Python 的变量作用域和 LEGB 原则相关推荐

  1. python中变量作用域

    python中变量作用域采取以下规则: 1.python能够改变变量作用域的代码段是def.class.lamda. 2.if/elif/else.try/except/finally.for/whi ...

  2. python legb_Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只 ...

  3. Python中变量作用域问题

    我们经常听说Python函数访问局部变量.全局变量:在定义装饰器的时候,还会使用自由变量.这些不同的变量是如何赋值.初始化.查找及修改的呢?各自的作用细则又是什么样的呢?本篇尝试解答这个问题. Pyt ...

  4. python函数变量的作用域_学不会的Python函数——变量作用域

    1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...

  5. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  6. Python之变量作用域

    文章目录 一 变量作用域 1. Local(局部变量) 2. Enclosed(嵌套) 3. Global(全局) 4. Built-in(内置) 二 变量使用规则 三 变量的修改 1. global ...

  7. python的变量作用域

    1. 不在函数体内的变量或者在 if __name__=='__main__'中的变量,都是全局变量,注意访问这些全局变量的速度是比较慢的,因为这些全局变量放在一个全局的表中,需要查找 2. 在函数体 ...

  8. python sizeof_python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗 赋值语句的原理...

    CPython implementation detail: This is the address of the object in memory. copy - Shallow and deep ...

  9. python中的变量的作用_Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量 E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域 G (Gl ...

最新文章

  1. [2018.12.9]BZOJ2153 设计铁路
  2. Java提高篇——单例模式
  3. 成功解决AttributeError: ‘PathCollection‘ object has no property ‘n_levels‘
  4. JAVA——一次性读取或者写入文本文件所有内容
  5. Zabbix 企业级监控_
  6. 数据结构--图 Graph
  7. 子类构造器Constructor是否可被Override(重写)
  8. python调用.so动态链接库,运行时报错 liblapack.so.3: undefined symbol: icamin_k
  9. 关于webuploader 在ie9上不能触发 input 的 change 事件
  10. matlab调用refprop9.0,Matlab调用REFPROP完全说明
  11. SPSS时序全局主成分分析方法
  12. 局域网体系结构与IEEE标准
  13. Linux 将某个文件夹授予某个用户读写权限
  14. java compute wmb_WMB驱动程序BUG
  15. python alpha通道_Python PIL完全删除每个alpha通道
  16. golang unshift
  17. 《沟通的方法》笔记十七:道歉
  18. 动态IP与静态IP的区别
  19. 163邮箱申请注册条件,邮件注册申请,邮箱的格式怎么写?
  20. Java中多线程、多线程的实现方式、同步代码块的方式

热门文章

  1. java程会释放锁join_关于join() 是否会释放锁的一些思考
  2. html如何在画布上加层,在Canvas中嵌套Html
  3. 笔记本电脑电源已接通未充电_dell xps15 电源已接通 未充电 维修方法
  4. 1835财务报表分析
  5. LoRaWAN 巩固了其作为低功耗广域网主导技术的地位
  6. cpythonjavagolang_cpython:列表对象(PyListObject)的扩容机制
  7. 天地一体化信息网络发展与拟态技术应用构想
  8. 10 Equality constrained minimization
  9. python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引
  10. linux kill进程后黑屏,Linux中Kill进程的N种方法