详解Python函数作用域的LEGB顺序


Posted in Python onMay 14, 2016

本文为大家介绍了Python函数作用域的查找顺序,供大家参考,具体内容如下

1.什么是LEGB?
L:local 函数内部作用域
E:enclosing 函数内部与内嵌函数之间
G:global 全局作用域
B:build-in 内置作用域

2.LEGB是作什么用的?
为什么非要介绍这个呢?或者说它们的作用是什么?
原因是因为我们的在学习Python函数的时候,经常会遇到很多定义域的问题,全部变量,内部变量,内部嵌入的函数,等等,Python是如何查找的呢?以及Python又是按照什么顺序来查找的呢?这里做一个顺序的说明

3.顺序是什么
跟名字一样,Python在函数里面的查找分为4种,称之为LEGB,也正是按照这种顺序来查找的。

首先,是local,先查找函数内部
然后,是enclosing,再查找函数内部与嵌入函数之间(是指在函数内部再次定义一个函数)
其次,是global,查找全局
最后,是build-in,内置作用域

4.举例说明
ex1

passline = 60

def func(val):
  if val >= passline:
    print('pass')
  else:
    print('failed')

func(89)  

'''''''''''' 
pass
[Finished in 0.2s] 
''''''''''''

Python函数首先查找local,在局部变量作用域里并没有passline的定义,然后发现函数内部并没有内嵌函数,这时Python开始查找global,在全局里查找到passline的定义,被调用。

ex2

def Max(val1, val2):
  return max(val1, val2)

print(Max(90, 100))

'''''''''
100
[Finished in 0.1s]
'''''''''

Max函数里面直接调用另外一个函数,调用的max()(注意两个函数的大小写不一样),该函数并没有被定义,但是却属于我们上述的第四种,属于build-in函数,既是在python标准库里的函数,内置的,可以直接调用的。最后一步才会查找到这里

关于第二种,属于内嵌函数,即使在函数里面再次定义一个函数,这时会首先查找local函数里面是否有定义,然后才会查找函数里面内嵌函数里面有没有定义,这一种有专门的名词,叫做闭包,闭包在之前一些文章中都有介绍,希望大家阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
python自动化测试之连接几组测试包实例
Sep 28 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Python pymongo模块常用操作分析
Sep 01 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
django数据库自动重连的方法实例
Jul 21 Python
python 实现生成均匀分布的点
Dec 05 Python
如何定义TensorFlow输入节点
Jan 23 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
python爬取51job中hr的邮箱
May 14 #Python
Phantomjs抓取渲染JS后的网页(Python代码)
May 13 #Python
python基于phantomjs实现导入图片
May 13 #Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 #Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 #Python
Python下载指定页面上图片的方法
May 12 #Python
Python基于二分查找实现求整数平方根的方法
May 12 #Python
You might like
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
javascript 函数及作用域总结介绍
2013/11/12 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
ajax是什么及其工作原理
2012/02/08 面试题
如何开发一个JQuery插件
2016/07/28 面试题
门诊挂号室室长岗位职责
2013/11/27 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
道路建设实施方案
2014/03/18 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
食品安全工作方案
2014/05/07 职场文书
超市工作总结范文2014
2014/12/19 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电