详解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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python中的闭包实例详解
Aug 29 Python
Python实用日期时间处理方法汇总
May 09 Python
详解Python编程中包的概念与管理
Oct 16 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python合并多个Excel数据的方法
Jul 16 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 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-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
基于node实现websocket协议
2016/04/25 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
详解Python中with语句的用法
2015/04/15 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python入门教程 python入门神图一张
2018/03/05 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
英文求职信范文
2014/05/23 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
师德师风剖析材料
2014/09/30 职场文书
工商行政处罚决定书
2015/06/24 职场文书
教师个人教学反思
2016/02/23 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记