美文网首页
作用域及global和nonlocal的应用

作用域及global和nonlocal的应用

作者: 简通 | 来源:发表于2023-09-02 23:23 被阅读0次

    1. 什么是作用域?

    LEGB是指在Python中变量的作用域规则,它是一个从内到外的顺序,表示了变量的查找顺序。LEGB分别代表了以下四个作用域:

    • Local(局部):指的是在函数内部定义的变量,只在函数内部有效。

    • Enclosing(嵌套):指的是在嵌套函数中定义的变量,对于内部函数来说,可以访问外部函数中定义的变量。

    • Global(全局):指的是在模块级别定义的变量,对于整个模块来说都是可见的。

    • Built-in(内置):指的是Python内置的函数和变量,如print()、len()等。

    当需要访问一个变量时,Python会按照LEGB的顺序进行查找,先从局部作用域开始查找,如果找不到再依次向外层作用域查找,直到找到或者到达全局作用域。如果最终还是找不到,则会抛出NameError异常。

    2. global关键字的应用

    在函数内部,如果想要修改全局作用域中的变量,可以使用global关键字。

    x = 10
    
    def modify_global():
        global x
        x = 20
    
    modify_global()
    print(x)  # 输出 20
    

    在上面的例子中,通过使用global关键字,我们可以在函数内部修改全局变量x的值。

    3. nonlocal关键字的应用

    在嵌套函数中,如果想要修改嵌套作用域中的变量,可以使用nonlocal关键字。

    def outer():
        x = 10
        
        def inner():
            nonlocal x
            x = 20
        
        inner()
        print(x)  # 输出 20
    
    outer()
    

    在上面的例子中,通过使用nonlocal关键字,我们可以在内部函数inner中修改外部函数outer中的变量x的值。

    4. 简单案例

    下面是一个简单的案例,演示了作用域、global和nonlocal的应用。

    x = 10
    
    def outer():
        y = 20
        
        def inner():
            nonlocal y
            global x
            x = 30
            y = 40
            print("inner函数中的x:", x)  # 输出 30
            print("inner函数中的y:", y)  # 输出 40
        
        inner()
        print("outer函数中的x:", x)  # 输出 30
        print("outer函数中的y:", y)  # 输出 40
    
    outer()
    print("全局作用域中的x:", x)  # 输出 30
    

    在上面的案例中,我们定义了一个全局变量x和一个外部函数outer,外部函数中定义了一个局部变量y和一个内部函数inner。在内部函数inner中,我们使用了nonlocal关键字修改了外部函数outer中的变量y的值,并使用global关键字修改了全局变量x的值。最后,我们分别在inner函数、outer函数和全局作用域中打印了变量x和y的值。

    相关文章

      网友评论

          本文标题:作用域及global和nonlocal的应用

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