Python 中的 Global 和 Nonlocal 关键字(python global声明全局变量、python nonlocal声明外层非全局作用域变量,主要用在嵌套函数中)模块作用域

文章目录

  • Python 中的 Global 和 Nonlocal 关键字
  • 概述
  • Global 关键字(声明使用全局变量)
  • 定义和用法
  • 示例代码
  • 何时使用
  • Nonlocal 关键字(声明使用外层非全局变量)
  • 定义和用法
  • 示例代码
  • 何时使用
  • 特别注意:nonlocal无法入侵模块级别的作用域
  • Global 与 Nonlocal 的比较
  • 主要区别
  • – `global` 声明全局作用域中的变量。
  • – `nonlocal` 声明非全局的外层作用域中的变量。
  • 使用场景
  • – 使用 `global` 适合那些需要跨多个函数操作或维护全局状态的场景。
  • – 使用 `nonlocal` 适合那些在嵌套函数间共享或修改变量的场景。
  • 实际应用
  • nonlocal
  • 计数器实例(可以统计函数被调用了多少次)
  • 其他应用
  • global
  • 全局配置示例
  • Python 中的 Global 和 Nonlocal 关键字

    概述

    在 Python 编程中,globalnonlocal 关键字是用来在函数或其他块中修改外部作用域变量的。这两个关键字在管理变量作用域时非常有用,尤其是在嵌套函数和大型项目中。本文将详细介绍这两个关键字的用法、区别以及实际应用场景。

    Global 关键字(声明使用全局变量)

    定义和用法

    global 关键字用于在函数内部声明变量为全局变量。当需要在一个函数内修改全局作用域中的变量时,就需要使用 global 关键字。

    示例代码
    x = 10  # 全局变量
    
    def modify_global():
        global x
        x = 20  # 修改全局变量
    
    modify_global()
    print(x)  # 输出: 20
    

    何时使用

    在需要从局部作用域改变全局变量的值时使用。这通常用在配置变量或状态变量上,这些变量需要跨多个函数调用共享。

    Nonlocal 关键字(声明使用外层非全局变量)

    定义和用法

    nonlocal 关键字用来在函数或其他作用域中使用外层(非全局)变量。它主要用在嵌套函数中,当需要修改嵌套作用域内的变量时。

    示例代码
    def outer():
        y = 10  # 外层函数中的局部变量
    
        def inner():
            nonlocal y
            y = 20  # 修改外层函数中的局部变量
    
        inner()
        return y
    
    print(outer())  # 输出: 20
    

    何时使用

    在嵌套函数中需要修改上层函数作用域的变量时使用。这通常用于闭包和装饰器中,其中内部函数需要修改它的外部环境。

    特别注意:nonlocal无法入侵模块级别的作用域

    在Python中,nonlocal 关键字用来在函数或其他作用域内修改外层(非全局)作用域的变量。nonlocal 的关键特性是它不能用于修改模块级别的全局变量。nonlocal 主要用于那些被嵌套在其他函数内部的函数中,允许这些内部函数修改更外层函数的局部变量。

    这里是一些关于 nonlocal 和它如何操作的关键点:

    1. 局部作用域间的链接nonlocal 会在当前函数的上层作用域中寻找变量,直到它找到匹配的变量名或达到全局作用域(但不包括全局作用域)。如果在非全局的外层作用域中找到了变量,nonlocal 将允许当前函数修改这个变量。

    2. 不穿透全局作用域nonlocal 不会与全局作用域的变量进行绑定或修改。如果需要修改全局作用域中的变量,应使用 global 关键字。

    3. 不用于模块级变量:由于 nonlocal 不穿透到全局作用域,所以它不能用于修改模块顶层定义的变量,即那些通常在脚本或模块最外层定义的变量。这些变量属于全局作用域。

    4. 使用限制:如果 nonlocal 声明的变量在所有可能的外层局部作用域中都未被找到,Python将抛出一个 SyntaxError

    这样的设计有助于维护作用域的清晰界限,避免嵌套函数无意中干扰到全局变量,这对于大型程序的可维护性和错误追踪是非常有帮助的。例如,使用 nonlocal 可以在闭包或装饰器等特定的编程模式中灵活地操作变量,而不影响到全局状态。这样的行为使得Python的作用域管理既灵活又安全。

    Global 与 Nonlocal 的比较

    主要区别

    global 声明全局作用域中的变量。
    nonlocal 声明非全局的外层作用域中的变量。

    使用场景

    – 使用 global 适合那些需要跨多个函数操作或维护全局状态的场景。
    – 使用 nonlocal 适合那些在嵌套函数间共享或修改变量的场景。

    实际应用

    nonlocal

    计数器实例(可以统计函数被调用了多少次)

    利用 nonlocal 实现一个简单的计数器,这显示了 nonlocal 在实际中的应用:

    def make_counter():
        count = 0
    
        def counter():
            nonlocal count
            count += 1
            return count
    
        return counter
    
    counter = make_counter()
    print(counter())  # 输出: 1
    print(counter())  # 输出: 2
    

    此计数器每次调用时递增,而 count 变量因 nonlocal 的声明,使得内部函数 counter() 能够修改其值。

    其他应用

    nonlocal 关键字的应用场景比较多样,除了用于计数器外,还常见于以下几个方面:

    1. 状态保持:在嵌套函数中,如果需要保持状态且状态不应该为全局可见,nonlocal 使得内部函数能够记住外层函数的状态,而不必将状态设置为全局变量。

    2. 闭包中的数据封装:使用闭包封装私有数据,通过 nonlocal 实现数据的修改和访问控制。这在一些设计模式如工厂模式或构造函数中特别有用,可以通过闭包来创建有特定行为的函数实例。

    3. 递归算法的辅助变量:在递归函数中,如果需要跨递归调用修改变量(如累加器或计数器),nonlocal 可以用来修改嵌套函数外层作用域的变量。

    4. 装饰器:在实现Python装饰器时,如果装饰器内部需要维护状态(例如记录函数调用次数或缓存函数结果),nonlocal 可以在嵌套的装饰器函数中用来修改状态。

    global

    全局配置示例

    使用 global 来维护一个应用程序的全局配置状态:

    configuration = {}
    
    def initialize_config():
        global configuration
        configuration['theme'] = 'Dark'
        configuration['timeout'] = 120
    
    initialize_config()
    print(configuration)  # 输出: {'theme': 'Dark', 'timeout': 120}
    

    在这个例子中,全局字典 configuration 在函数 initialize_config() 中被修改,用来存储应用的配置信息。

    作者:Dontla

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 中的 Global 和 Nonlocal 关键字(python global声明全局变量、python nonlocal声明外层非全局作用域变量,主要用在嵌套函数中)模块作用域

    发表回复