美文网首页
函数 -- 变量作用域

函数 -- 变量作用域

作者: __深蓝__ | 来源:发表于2019-01-07 15:51 被阅读0次
    • Python程序中,变量并不是在任何位置都可以访问,访问权限取决于变量在哪里赋值。
    • 变量作用域决定了什么位置可以访问什么变量。
    • 作用域一共有4种,分别是:
      • L (Local) 局部作用域
      • E (Enclosing) 闭包函数外的函数中
      • G (Global) 全局作用域
      • B (Built-in) 内建作用域
    • L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
    x = int(2.9)         # 内建作用域
     
    g_count = 0          # 全局作用域
    def outer():
        o_count = 1      # 闭包函数外的函数中
        def inner():
            i_count = 2  # 局部作用域
    
    • 模块(module)类(class)函数(def、lambda)会引入新作用域
    • if/elif/elsetry/exceptfor/while语句不会引入新作用域
    • 没有引入新作用域的变量,作用域外部也可以访问
    • 引入新作用域
    >>> def test():
    ...     msg_inner = 'I am from Neuedu'
    ... 
    >>> msg_inner  # 外部无法访问
    NameError: name 'msg_inner' is not defined
    
    • 没有引入新作用域
    >>> if True:
    ...  msg = 'I am from Neuedu'
    ... 
    >>> msg  # 外部可以访问
    'I am from Neuedu'
    >>> 
    
    局部变量和全局变量
    • 局部变量是在函数内部定义的变量,只能在函数内部使用,在函数执行时被创建,执行结束后被系统回收
    • 全局变量是在函数外部定义的变量,所有函数内部都可以使用,但是不允许直接修改全局变量的值
    total = 0   # 这是一个全局变量
    def sum( arg1, arg2 ):
        total = arg1 + arg2      # total是局部变量.
        print ("函数内是局部变量 : ", total)
        return total
    
    sum( 10, 20 )
    print ("函数外是全局变量 : ", total)
    
    
    函数内是局部变量 :  30
    函数外是全局变量 :  0
    
    global 和 nonlocal关键字

    内部作用域修改外部作用域变量时,使用global关键字

    num = 1
    def fun1():
        global num    # 使用global关键字声明这是全局变量
        print(num) 
        num = 123
        print(num)
    
    fun1()
    print(num)
    
    
    1
    123
    123
    

    修改嵌套作用域中,外层非全局作用域的变量时,使用 nonlocal 关键字

    def outer():
        num = 10
        def inner():
            nonlocal num   # nonlocal关键字声明
            num = 100
            print(num)
        inner()
        print(num)
    outer()
    
    100
    100
    
    • 为了保证所有的函数都能正确使用全局变量,应该将其定义在所有函数上方
    • 全局变量名前应该增加 g_ 或者 gl_ 的前缀




    - end -

    相关文章

      网友评论

          本文标题:函数 -- 变量作用域

          本文链接:https://www.haomeiwen.com/subject/qbbqrqtx.html