详解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高效编程技巧
Jan 07 Python
python利用拉链法实现字典方法示例
Mar 25 Python
python基础练习之几个简单的游戏
Nov 10 Python
Python IDLE清空窗口的实例
Jun 25 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
Python中的字符串切片(截取字符串)的详解
May 15 Python
selenium处理元素定位点击无效问题
Jun 12 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python numpy中cumsum的用法详解
Oct 17 Python
Python如何实现动态数组
Nov 02 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 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中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
PHP输出日历表代码实例
2015/03/27 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
parentElement,srcElement的使用小结
2014/01/13 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
一张图带我们入门Python基础教程
2017/02/05 Python
简单了解django文件下载方式
2020/02/10 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
进程的查看和调度分别使用什么命令
2013/12/14 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
高中毕业生自我鉴定范文
2013/09/26 职场文书
十岁生日同学答谢词
2014/01/19 职场文书
办公室人员先进事迹
2014/01/27 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
利用Python实现Picgo图床工具
2021/11/23 Python
python中pycryto实现数据加密
2022/04/29 Python