Python 的变量作用域和 LEGB 原则
- 每一个模块都是全局作用域。也就是说,创建于模块文件顶层的变量具有全局作用域,对于外部访问就成了一个模块对象的属性。
- 全局作用域的作用范围仅限于单个文件。“全局”指的是在一个文件的顶层变量名对于这个文件而言是全局的。
- 每次对函数的调用都创建了一个新的本地作用域。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 原则相关推荐
- python中变量作用域
python中变量作用域采取以下规则: 1.python能够改变变量作用域的代码段是def.class.lamda. 2.if/elif/else.try/except/finally.for/whi ...
- python legb_Python变量作用域LEGB用法解析
这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只 ...
- Python中变量作用域问题
我们经常听说Python函数访问局部变量.全局变量:在定义装饰器的时候,还会使用自由变量.这些不同的变量是如何赋值.初始化.查找及修改的呢?各自的作用细则又是什么样的呢?本篇尝试解答这个问题. Pyt ...
- python函数变量的作用域_学不会的Python函数——变量作用域
1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...
- Python基础-变量作用域
1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...
- Python之变量作用域
文章目录 一 变量作用域 1. Local(局部变量) 2. Enclosed(嵌套) 3. Global(全局) 4. Built-in(内置) 二 变量使用规则 三 变量的修改 1. global ...
- python的变量作用域
1. 不在函数体内的变量或者在 if __name__=='__main__'中的变量,都是全局变量,注意访问这些全局变量的速度是比较慢的,因为这些全局变量放在一个全局的表中,需要查找 2. 在函数体 ...
- python sizeof_python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗 赋值语句的原理...
CPython implementation detail: This is the address of the object in memory. copy - Shallow and deep ...
- python中的变量的作用_Python中的变量作用域
python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量 E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域 G (Gl ...
最新文章
- [2018.12.9]BZOJ2153 设计铁路
- Java提高篇——单例模式
- 成功解决AttributeError: ‘PathCollection‘ object has no property ‘n_levels‘
- JAVA——一次性读取或者写入文本文件所有内容
- Zabbix 企业级监控_
- 数据结构--图 Graph
- 子类构造器Constructor是否可被Override(重写)
- python调用.so动态链接库,运行时报错 liblapack.so.3: undefined symbol: icamin_k
- 关于webuploader 在ie9上不能触发 input 的 change 事件
- matlab调用refprop9.0,Matlab调用REFPROP完全说明
- SPSS时序全局主成分分析方法
- 局域网体系结构与IEEE标准
- Linux 将某个文件夹授予某个用户读写权限
- java compute wmb_WMB驱动程序BUG
- python alpha通道_Python PIL完全删除每个alpha通道
- golang unshift
- 《沟通的方法》笔记十七:道歉
- 动态IP与静态IP的区别
- 163邮箱申请注册条件,邮件注册申请,邮箱的格式怎么写?
- Java中多线程、多线程的实现方式、同步代码块的方式
热门文章
- java程会释放锁join_关于join() 是否会释放锁的一些思考
- html如何在画布上加层,在Canvas中嵌套Html
- 笔记本电脑电源已接通未充电_dell xps15 电源已接通 未充电 维修方法
- 1835财务报表分析
- LoRaWAN 巩固了其作为低功耗广域网主导技术的地位
- cpythonjavagolang_cpython:列表对象(PyListObject)的扩容机制
- 天地一体化信息网络发展与拟态技术应用构想
- 10 Equality constrained minimization
- python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引
- linux kill进程后黑屏,Linux中Kill进程的N种方法