zoukankan      html  css  js  c++  java
  • Python函数作用域的查找顺序

    函数作用域的LEGB顺序

    1.什么是LEGB? 
    L:local 函数内部作用域 
    E:enclosing 函数内部与内嵌函数之间 
    G:global 全局作用域 
    B:build-in 内置作用域

    2.它们是作什么用的 
    为什么非要介绍这个呢?或者说它们的作用是什么? 
    原因是因为我们的在学习Python函数的时候,经常会遇到很多定义域的问题,全部变量,内部变量,内部嵌入的函数,等等,Python是如何查找的呢?以及Python又是按照什么顺序来查找的呢?这里做一个顺序的说明

    3.顺序是什么 
    跟名字一样,Python在函数里面的查找分为4种,称之为LEGB,也正是按照这种顺序来查找的。

    首先,是local,先查找函数内部 
    然后,是enclosing,再查找函数内部与嵌入函数之间(是指在函数内部再次定义一个函数) 
    其次,是global,查找全局 
    最后,是build-in,内置作用域

    4.举例说明 
    ex1

     1 passline = 60
     2 
     3 def func(val):
     4     if val >= passline:
     5         print('pass')
     6     else:
     7         print('failed')
     8 
     9 func(89)    
    10 
    11 ''''''''''''  
    12 pass
    13 [Finished in 0.2s]  
    14 ''''''''''''
    
    

    Python函数首先查找local,在局部变量作用域里并没有passline的定义,然后发现函数内部并没有内嵌函数,这时Python开始查找global,在全局里查找到passline的定义,被调用。

    ex2

    1 def Max(val1, val2):
    2     return max(val1, val2)
    3 
    4 print(Max(90, 100))
    5 
    6 '''''''''
    7 100
    8 [Finished in 0.1s]
    9 '''''''''

    Max函数里面直接调用另外一个函数,调用的max()(注意两个函数的大小写不一样),该函数并没有被定义,但是却属于我们上述的第四种,属于build-in函数,既是在python标准库里的函数,内置的,可以直接调用的。最后一步才会查找到这里

    关于第二种,属于内嵌函数,即使在函数里面再次定义一个函数,这时会首先查找local函数里面是否有定义,然后才会查找函数里面内嵌函数里面有没有定义,这一种有专门的名词,叫做闭包,闭包将在另外文章里专门写到 

    作者:岑宇
    出处:http://www.cnblogs.com/cenyu/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
    >
  • 相关阅读:
    opacity背景层透明导致文字也透明
    [css3]叉叉旋转效果
    [css]当父元素的margin-top碰上子元素的margin-top
    Python_Mix*异常处理
    Python_Mix*OS模块,序列化模块种的json,pickle
    Python_Mix*random模块,time模块,sys模块,os模块
    Python_Mix*re模块基础方法,进阶,正则表达式的使用
    Python_Mix*re模块,元字符,量词
    Python_Mix*匿名函数,sorted,filter,map,递归函数,二分法查找
    Python_Mix*内置函数
  • 原文地址:https://www.cnblogs.com/cenyu/p/5492674.html
Copyright © 2011-2022 走看看