`
hulianwang2014
  • 浏览: 690898 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

python中变量作用域及嵌套作用域

 
阅读更多
在python中,变量查找遵循LGB原则,即优先在局部作用域(local scope)中对变量进行查找,失败则在全局作用域(global scope)中进行查找,最后尝试再内建作用域(build-in scope)内查找,如果还是未找到的话,则抛出异常。后来由于闭包和嵌套函数的出现,作用域又增加了外部作用域,这样变量的查找作用域优先级变为:局部、外部、全局和内建。 作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域。变量名引用分为三个作用域进行查找:首先是本地,然后是函数内(如果有的话),之后是全局,最后是内置。在默认情况下,变量名赋值会创建或者改变本地变量。全局声明将会给映射到模块文件内部的作用域的变量名赋值。Python 的变量名解析机制也称为 LEGB 法则,具体如下:当在函数中使用未确定的变量名时,Python 搜索 4 个作用域:本地作用域(L),之后是上一层嵌套结构中 def 或 lambda 的本地作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按这个查找原则,在第一处找到的地方停止。如果没有找到,Python 会报错的。

a = 1
def f():
      a = 2
def g():
       print a //[1]:输出结果为2
return g
func = f()
func()//[2]



代码的[2]处调用的函数实际上调用的是函数f 中定义的内嵌函数g,在代码 的[1]处,函数g 内的“print a”的输出结果为2。初看上去有些疑问,因为函数f 内的约束“a = 2”在其之外应该是不起作用的,当执行func()时,起作用的约束应该是“a = 1”才对。但是我们之前说到了,作用域仅仅是由文本决定的,函数g 位于函数f 之内,所以函数g 定义的作用域内嵌于函数f 的作用域之内。换句话说,函数f 的作用域是函数g 的作用域的直接外围作用域,所以,按照最内嵌套作用域规则,[1]处的名字引用应该引用的是函数f 定义的作用域中所创建的约束。

尽管在代码清单8-2 的[2]处,“a = 2”这个约束已经不起作用了,但是Python 在执行“func = f()”时,会执行函数f 中的“def g():”语句,这时Python 会将约束“a = 2”与函数g 对应的函数对象捆绑在一起,将捆绑后的结果返回,这个捆绑起来的整体被称为“闭包”。

实际上这里有一个相当微妙的问题,最内嵌套作用域规则是“闭包”的结果呢,还是“闭包”是最内嵌套作用域规则的实现方案?这两个问题看上去是一致的,但却隐含着谁决定谁的关系。实际上,Python 实现闭包是为了实现最内嵌套作用域规则。换句话说,最内嵌套作用域规则是语言设计时的设计策略,即是形而上的“道”;而闭包则实现语言时的一种方案,即是形而下的“器”。

python能够改变变量作用域的代码段是def、class、lamda.

    def scopetest():  
        localvar=6;  
        print(localvar)  
        
    scopetest()  
    #print(localvar) #去除注释这里会报错,因为localvar是本地变量  

    if/elif/else、try/except/finally、for/while

    while True:  
        newvar=8  
        print(newvar)  
        break;  
      
    print(newvar)  
      
    try:  
        newlocal=7  
        raise Exception  
    except:  
        print(newlocal)#可以直接使用哦  

输出结果:8 8 7

可见这个关键字中定义变量,他们的作用域跟外部是一致的,这个跟Java的作用域概念有点不一样。

    变量搜索路径是:本地变量->全局变量

    def scopetest():  
        var=6;  
        print(var)#  
          
    var=5   
    print(var)  
    scopetest()  
    print(var)  

输出结果:5 6 5

这里var 首先搜索的是本地变量,scopetest()中 var=6相当于自己定义了一个局部变量,赋值为6. 当然如果的确要修改全局变量的值,则需要如下:

    def scopetest():  
        global var   
        var=6;  
        print(var)#  
          
    var=5   
    print(var)  
    scopetest()  
    print(var)  

输出结果:5 6 6

再看一种这种情况:

    def scopetest():  
        var=6;  
        print(var)#  
        def innerFunc():  
            print(var)#look here  
        innerFunc()  
          
    var=5   
    print(var)  
    scopetest()  
    print(var)  

输出结果:5 6 6 5





分享到:
评论

相关推荐

    python中变量作用域及嵌套作用域.pdf

    python中变量作用域及嵌套作用域.pdf

    python中变量作用域及嵌套作用域.docx

    python中变量作用域及嵌套作用域.docx

    python中变量作用域及嵌套作用域扫描.pdf

    python中变量作用域及嵌套作用域扫描.pdf

    学习python中变量作用域及嵌套作用域.pdf

    学习python中变量作用域及嵌套作用域.pdf

    python中变量作用域及嵌套作用域宣贯.pdf

    python中变量作用域及嵌套作用域宣贯.pdf

    Python语言基础:作用域.pptx

    02作用域的查找顺序作用域的查找顺序在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。 规则顺序:?L -> E -> G -> B。在局部找不到,便会去局部外的局部找...

    Python变量在函数中的作用域.md

    嵌套函数中的变量作用域的特点和限制; 如何利用作用域规则在函数内部访问外层函数的变量。 阅读建议 为了更好地理解和掌握本文所介绍的内容,建议您: 在实际Python项目中多尝试编写函数并使用局部变量; 学习理解...

    Python中的作用域规则详解

    Python是静态作用域语言,尽管它...在Python 2.2中,Python正式引入了一种新的作用域 — 嵌套作用域;在Python 2.1中,嵌套作用域可以作为一个选项被开启;嵌套作用域的引入,本质上为Python实现了对闭包的支持,关于

    python函数的作用域及关键字详解

    搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。 local和enclosing是相对的,enclosing变量相对上层来说也是local。 作用域产生 在Python中,只有模

    基于Python闭包及其作用域详解

    关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于...在 Python 中,作用域实际上可以看做是“在当前上下文的位置,获取命名空间变量的规则”。在 Python 代码执行的任意位置,都至少存在三层嵌套的作

    Python中的变量和作用域详解

    python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量; E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的; G:globa,全局变量,就是模块级别定义...

    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    外层函数内部嵌套内部函数,外层函数分割变量作用域,并返回内部函数的引用。 # 外层函数负责分割作用域,内层函数才是闭包提供的功能。 外层函数返回内层函数的引用,供外部使用。 def my_line(k, b): # k,b只在my_...

    详解Python函数作用域的LEGB顺序

    本文为大家介绍了Python函数作用域的查找顺序,供大家参考,具体内容如下 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.LEGB是作...

    python中嵌套函数的实操步骤

    您可能感兴趣的文章:python嵌套函数使用外部函数变量的方法(Python2和Python3)python编程嵌套函数实例代码从局部变量和全局变量开始全面解析Python中变量的作用域深入解析Python中函数的参数与作用域解读Python编程...

    Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只是闭包的特殊场景...

    基于Python函数和变量名解析

    1)、全局函数:定义在模块中,每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文 2)、局部函数:嵌套在其它函数中 3)、lambda函数:表达式 4)、方法:与特定数据类型关联的函数表,并且只能...

    python变量的作用域

    先看一个嵌套定义函数的实例 a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): nonlocal a #声明了一个上面第一层局部变量 a += 1 #不可变数据类型的修改 inner2() print('¥¥a¥¥ : ', a) ...

    python基础2day05.txt

    python 作用域 局部作用域 外部嵌套函数作用域 模块级的作用域(全局作用域) 内建模块的作用域 global 语句 声明 nonlocal 语句 lambda 表达式(用来创建匿名函数) lambda 参数列表: 表达式 exec / eval...

Global site tag (gtag.js) - Google Analytics