zoukankan      html  css  js  c++  java
  • Python开发【第十二篇】python作用域和global nonlocal

    python的作用域

    作用域也叫名字空间,是访问变量时查找变量名的范围空间

    python中的四个作用域 LEGB

    作用域 英文解释 英文缩写
    局部作用域 Local(function) L
    外部嵌套函数作用域 Enclosing Function local E
    函数定义所在模块(文件)的作用域 Global(module) G
    Python内建模块的作用域 Builtin(python) B

    示例:

    # 此示例示意作用域
    v = 100
    def f1():
        v = 200
        print("f1.v=", v)
        def f2():
            v = 300
            print("f2.v=", v)
        f2()
    f1()
    print("v=", v)
    

    变量名的查找规则
    L ---> E ---> G ----> B
    注:
    在默认的情况下,变量名赋值会创建或改变当前作用域
    内变量的绑定关系

    global语句

    作用:

    告诉解释执行器,global语句声明的一个或多个变量
    这些变量的作用域为模块级的作用域,也称为全局变量
    全局声明(global)将赋值语句的变量映射到模块文件内部的作用域
    

    语法:

    global 变量名1
    global 变量名1,变量名2,....
    

    示例:

    # 此示例示意global语句的语法和用法
    v = 100
    def f1():
        global v  # global声明v为全局变量
        v = 200  # 想让此赋值语句去修改全局变量v
    
    f1()
    print('v=', v)  # 200
    

    说明:

    全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
    
    全局变量在函数内部不经过声明就可以直接访问(取值)
    
    不能先创建局部变量,再用global声明为全局变量,此种做法不符合规则
    
    global变量列表里的变量名不能出现在函数的形参列表里
    
    

    nonlocal语句

    作用:

    告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
    

    语法:

     nonlocal 变量名1, 变量名2, ....
    

    示例:

    # 此示例示意nolocal 语句的语法和用法
    v = 100
    def f1():
        v = 200
        print("f1.v=", v)
        def f2():
            nonlocal v
            v = 300
            print("f2.v=", v)
        f2()
        print("f1.v=", v)
    f1()
    print("全局的v=", v)
    

    说明:

    nonlocal语句只能在被嵌套函数内部进行使用
    对nonlocal变量进行赋值将对外部嵌套函数作用域内的变量进行操作
    当有两层或者两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作
    nonlocal语句的变量列表里的变量名不能出现在此函数的形参列表中
    

    def 语句的作用是创建函数

    lambda 表达式(又称匿名函数)
    作用:

        创建一个匿名函数对象
        同def 类似,但不提供函数名
    

    语法:

     lambda [函数形参列表]: 表达式
    

    示例:

    # 此示例示意lambda 表达式的语法和用法
    # def myadd(x, y):
    #     return x + y
    
    # 用lambda表达式来创建上面的函数
    myadd = lambda x, y: x + y
    
    print("20+30=", myadd(20, 30))  # 50
    print("4 + 5 =", myadd(4, 5))  # 9
    
    

    说明:

       1. lambda 表达式创建的函数只能包含一条表达式
       2. lambda 比函数简单,且可以随时创建和销毁,有利于
          降低程序的偶合度
    

    eval函数和exec() 函数

    eval(source, global=None, local=None), 把一个
    字符串source 当成一个表达式来执行,返回表达式执
    行后的结果
    exec(source, global=None, local=None) 把一个
    字符串source当成程序来执行

  • 相关阅读:
    DataTable.AcceptChanges方法有何用处
    ItemArray DataRow对象的RowState和DataRowVersion属性特点
    C#中MessageBox用法大全(附效果图)
    tp5数据库操作 模型层
    07-11 Linux命令操作
    Thinkphp模板标签if和eq的区别和比较
    TP3.2单字母函数
    0629-TP整理四(create(),success(),error(),U())
    0627-TP整理三(对表的操作,数据的显示)
    0626-TP整理二(调试模式,空操作,跨控制器调用,跨方法跳转--redirect(),框架语法,创建model模型)
  • 原文地址:https://www.cnblogs.com/pyliuwei/p/11731338.html
Copyright © 2011-2022 走看看