• Python基础知识(十一)—作用域


    作用域LEGB

    1.作用域:变量起作用的范围。

    2.Local局部作用域:函数内部。

    3.Enclosing  外部嵌套作用域 :函数嵌套。

    4.Global全局作用域:模块(.py文件)内部。

    5.Builtin内置模块作用域:builtins.py文件。

    x = int(2.9)  # int built-in 内置模块作用域
    
    g_count = 0  # global 全局作用局
    
    def outer():
        o_count = 1  # enclosing 外部嵌套作用域
    
        def inner():
            i_count = 2  # local 函数内部
            print(o_count)
    
        # print(i_count)  # 变量i_count在inner函数里面,所以在inner函数外面找不到
        inner()
    
    outer()  # 1
    
    # print(o_count) # 变量o_count在outer函数里面,所以在outer函数外面找不到

    当然,local和enclosing是相对的,enclosing变量相对上层来说也是local。

    变量名的查找规则

    1.由内到外:L -> E -> G -> B

    2.在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置变量。

    局部变量

    1.定义在函数内部的变量(形参也是局部变量)

    2.只能在函数内部使用

    3.调用函数时才被创建,函数结束后自动销毁

    全局变量

    1.定义在函数外部,模块内部的变量。

    2.在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。

    global 语句

    1.作用

    在函数内部修改全局变量。

    在函数内部定义全局变量(全局声明)。

    2.语法:global 变量1, 变量2, …

    3.说明:

    在函数内直接为全局变量赋值,视为创建新的局部变量。

    不能先声明局部的变量,再用global声明为全局变量。

    nonlocal 语句

    作用:在内层函数修改外层嵌套函数内的变量

    语法:nonlocal 变量名1,变量名2, ...

    说明:在被嵌套的内函数中进行使用

    g01 = 500
    
    def fun01():
      g01 = 600# 没有修改全局变量g01,而是创建了局部变量g01
      print(g01)#600
      # 局部作用域
      l01 = 100
    
    def fun02():
      print(g01)
      # 局部作用域
      l01 = 200
    
    def fun03():
      # 通过global语句,定义g01为全局变量
      global g01
      g01 = 300# 修改的是全局变量
    
    fun03()                        fun01() 
    fun01()                        fun02() 
    fun02()# 600   300             fun03()#600  500

     小结 

    (1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;

    (2)只有模块、类、及函数才能引入新作用域;

    (3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;

    (4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个关键字,就能完美的实现闭包了。 

  • 相关阅读:
    Spring框架(二)
    Spring框架(一)
    SpringMVC中映射路径的用法之请求限制、命名空间
    关于映射路径@ReuqestMapping的总结
    关于什么是SpringMVC,和SpringMVC基于xml配置、注解配置、纯注解配置
    Spring Jdbc 框架整合的第一天
    Docker 搭建java+tomcat
    使用Docker安装mysql
    centos7.2 64位安装java
    Linux vim 基本操作
  • 原文地址:https://www.cnblogs.com/maplethefox/p/10817130.html
Copyright © 2020-2023  润新知