详解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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
基于python的字节编译详解
Sep 20 Python
python list元素为tuple时的排序方法
Apr 18 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
python画双y轴图像的示例代码
Jul 07 Python
python flask几分钟实现web服务的例子
Jul 26 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
Pandas加速代码之避免使用for循环
May 30 Python
PyMongo 查询数据的实现
Jun 28 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
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
js的回调函数详解
2015/01/05 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
以太网Ethernet IEEE802.3
2013/08/05 面试题
《悯农》教学反思
2014/04/28 职场文书
教师业务学习材料
2014/12/16 职场文书
劳模事迹材料范文
2014/12/24 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android