zoukankan      html  css  js  c++  java
  • 变量作用域

    作用域

    作用范围:built-in>global>enclosing>local

    作用范围:global>enclosing>local>built-in

    L(local)局部作用域

    局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
    注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

    E(enclosing)嵌套作用域

    E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

    G(global)全局作用域

    即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
    注意:全局作用域的作用范围仅限于单个模块文件内

    B(built-in)内置作用域

    系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。

    变量名解析LEGB法则

    搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
    LEGB法则: 当在函数中使用未确定的变量名时,Python会按照优先级依次搜索4个作用域,以此来确定该变量名的意义。首先搜索局部作用域(L),之后是上一层嵌套结构中def或lambda函数的嵌套作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按这个查找原则,在第一处找到的地方停止。如果没有找到,则会出发NameError错误。

    例:

     1 x=int(2.9)    #int built-in
     2 
     3 g_count = 0   #global
     4 def outer():
     5     o_count = 1  #enclosing
     6     i_count = 2
     7     def inner():
     8         i_count = 3 #local
     9         print(i_count)
    10     inner()
    11 outer()

    局部调用全局变量

     1 count = 10
     2 def outer():
     3     #global count        #如果要在局部修改全局变量  那么要加global参数 声明是全局变量 之后就可以修改了
     4     #count += 1          #全局变量不能在局部修改 此处做了+1操作 所以不行
     5     count=5              #此时count赋值是局部变量 这个count与全局的count不是一个count 并不是修改全局变量的操作
     6 
     7 outer()
     8 
     9 
    10 def outer():
    11     count = 10
    12     def inner():
    13         nonlocal count            #申明count使用的是在enclosing的count
    14         count = 20
    15         print(count)
    16     inner()
    17 outer()
  • 相关阅读:
    两个List集合过滤出不同集合
    TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
    sql server 查询某个表被哪些存储过程调用
    SQL server字符分割
    oracle 结果集合并
    tree与GridView交互
    oracle job相关
    ImportFileHandler 附件上传
    dt转换List CovertListHelper
    node版本管理mac版
  • 原文地址:https://www.cnblogs.com/cindy7/p/10927865.html
Copyright © 2011-2022 走看看