详解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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
对python周期性定时器的示例详解
Feb 19 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
python代理工具mitmproxy使用指南
Jul 04 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
用于table内容排序
2006/07/21 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python信息抽取之乱码解决办法
2017/06/29 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
解决Django中多条件查询的问题
2019/07/18 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers