详解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操作MySQL简单实现方法
Jan 26 Python
深入理解Python中的元类(metaclass)
Feb 14 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
python保存数据到本地文件的方法
Jun 23 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
Python生成器generator原理及用法解析
Jul 20 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
Python中tell()方法的使用详解
2015/05/24 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
scrapy爬虫实例分享
2017/12/28 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
python实现宿舍管理系统
2019/11/22 Python
python文件编写好后如何实践
2020/07/07 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
python 实现逻辑回归
2020/12/30 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
优乐美广告词
2014/03/14 职场文书
绿化工程实施方案
2014/03/17 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
社区母亲节活动总结
2015/02/10 职场文书
格林童话读书笔记
2015/06/30 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
如何在Python中妥善使用进度条详解
2022/04/05 Python
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript