详解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实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
深入源码解析Python中的对象与类型
Dec 11 Python
python验证码识别的实例详解
Sep 09 Python
python中map()函数的使用方法示例
Sep 29 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
python添加菜单图文讲解
Jun 04 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 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 获取完整url地址
2008/12/20 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
popdiv
2006/07/14 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JS常见算法详解
2017/02/28 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
python简单猜数游戏实例
2015/07/09 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
Python3离线安装Requests模块问题
2019/10/13 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
通过Python实现一个简单的html页面
2020/05/16 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
一套Java笔试题
2016/08/20 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
数学教师个人工作总结
2015/02/06 职场文书
公司停电通知
2015/04/15 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
Go语言安装并操作redis的go-redis库
2022/04/14 Golang