详解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的列表中利用remove()方法删除元素的教程
May 21 Python
Python设置默认编码为utf8的方法
Jul 01 Python
python实现拓扑排序的基本教程
Mar 11 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
对python中的argv和argc使用详解
Dec 15 Python
Python3实现的反转单链表算法示例
Mar 08 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 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异常处理定义与使用方法分析
2017/07/25 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
javascript 中null和undefined区分和比较
2017/04/19 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
python 错误处理 assert详解
2020/04/20 Python
python如何删除文件、目录
2020/06/23 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
买房子个人收入证明
2014/01/16 职场文书
低碳环保倡议书
2014/04/14 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
设计大赛策划方案
2014/06/13 职场文书
员工2014年度工作总结
2014/12/09 职场文书
元宵节寄语大全
2015/02/27 职场文书
放假通知范文
2015/04/14 职场文书
工程服务质量承诺书
2015/04/29 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle