• python学习之【第九篇】:Python中的变量作用域


    1.前言

    Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

    2.变量作用域

    变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

    • L (Local) 局部作用域
    • E (Enclosing) 闭包函数外的函数中
    • G (Global) 全局作用域
    • B (Built-in) 内建作用域

    以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
    Python中只有模块(module),类(class)以及函数(deflambda)才会引入新的作用域,

    • 局部作用域
    x = int(3.3)
    
    x = 0
    def outer():
        x = 1
        def inner():
            x = 2
            print(x)
        inner()
    
    outer()
    

    输出结果为2,因为此时直接在函数inner内部找到了变量x

    • 闭包函数外的函数中
    x = int(3.3)
    
    x = 0
    def outer():
        x = 1
        def inner():
            i = 2
            print(x)
        inner()
    
    outer()
    

    输出结果为1,因为在内部函数 inner中找不到变量x,继续去局部外的局部——函数outer 中找,这时找到了,输出 1。

    • 全局作用域
    x = int(3.3)
    x = 0
    def outer():
        o = 1
        def inner():
            i = 2
            print(x)
        inner()
    
    outer()
    

    输出结果为0,在局部(inner函数)、局部的局部(outer函数)都没找到变量 x,于是访问全局变量,此时找到了并输出。

    • 内建作用域
    x = int(3.3)
    g = 0
    def outer():
        o = 1
        def inner():
            i = 2
            print(x)
        inner()
    
    outer()
    

    执行结果为3,在局部(inner函数)、局部的局部(outer函数)以及全局变量中都没有找到变量x,于是访问内建变量,此时找到了并输出。

    3.全局变量与局部变量

    变量有全局变量和局部变量之分。定义在函数内部的变量拥有局部作用域,称为局部变量;定义在函数外的变量拥有全局作用域,称为全局变量。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。全局变量除非被手动删除,否则它们会存活到整个脚本运行结束,且对于脚本内所有的函数,全局变量的值都可以被访问。然而,局部变量仅仅依赖于定义它们的函数现阶段是否被调用,当函数被调用,则函数内部定义的局部变量就进入了声明它们的作用域,一旦函数运行完成,局部变量就会离开作用域,被释放掉。

    g_str = "foo"
    
    def foo():
        l_str = "bar"
        print(g_str)  # 在局部作用域中访问全局变量,输出"foo"
        print(l_str)  # 在局部作用域中访问局部变量,输出"bar"
    
    foo()
    print(g_str)     # 在全局作用域中访问全局变量,输出"foo"
    print(l_str)     # 在全局作用域中访问局部变量,报错
    

    在上面例子中,变量g_str处于脚本的全局作用域中,为全局变量,所以在任意地方都可以被访问到;而l_str存在于foo()函数内,为局部变量,所以只能在函数内部被访问,函数外部的全局作用域中不能访问。

    4.global关键字

    在函数内部,可以任意访问全局作用域中的变量,但是不能修改,如果需要在函数内部修改全局作用域中的变量时,就必须使用global关键字。

    • 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以在改变时必须使用global进行声明,否则会出错
    a = 100
    def test():
        global a
        print('-----修改前-----a=%s' % a)
        a = 200
        print('-----修改后-----a=%s' % a)
    
    test()
    # 输出
    # -----修改前-----a=100
    # -----修改后-----a=200
    
    • 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。
    li = [1, 2, 3]
    
    def test1():
        li.append(4)
        print(li)
    
    test1()  # 输出[1,2,3,4]
    

    5.nonlocal关键字

    global关键字是直接修改全局变量时所需要声明的如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要nonlocal关键字了.

    a = 100
    
    def foo():
        b = 200
        def bar():
            nonlocal b
            print('-----修改前-----b=%s' % b)
            b = 666
            print('-----修改后-----b=%s' % b)
        bar()
    
    foo()
    # 输出
    # -----修改前-----b=200
    # -----修改后-----b=666
    

    上面例子中,在bar()函数内部修改上一级作用域中的变量b时,需要使用nonlocal进行声明。
    (完)

  • 相关阅读:
    关于给Tomcat设置maxPostSize的问题
    完美激活PyCharm教程
    Tomcat +Nginx+Redis实现session共享
    python 上传多文件
    吸引注意力的动画
    Create React App 安装less 报错
    2020软件工程作业01
    yum用法
    rpm包的管理
    共享依赖库的误移或误删解决办法
  • 原文地址:https://www.cnblogs.com/wangjiachen666/p/9662277.html
Copyright © 2020-2023  润新知