详解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之模块的加载
Oct 24 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
python基础教程之Filter使用方法
Jan 17 Python
Python输出带颜色的字符串实例
Oct 10 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
python语音识别实践之百度语音API
Aug 30 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
使用TFRecord存取多个数据案例
Feb 17 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 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
合作指挥官:孟斯克
2020/03/16 星际争霸
通过对php一些服务器端特性的配置加强php的安全
2006/10/09 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
PHP chop()函数讲解
2019/02/11 PHP
JS中 用户登录系统的解决办法
2013/04/15 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
如何查看python关键字
2021/01/17 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
干部培训自我鉴定
2014/01/22 职场文书
活动策划邀请函
2014/02/06 职场文书
高中生职业规划范文
2014/03/09 职场文书
大学军训感言300字
2014/03/09 职场文书
篝火晚会策划方案
2014/05/16 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL