找回密码
 会员注册
查看: 28|回复: 0

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

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71362
发表于 2024-9-6 11:24:25 | 显示全部楼层 |阅读模式
文章目录Python中的Global和Nonlocal关键字概述Global关键字(声明使用全局变量)定义和用法示例代码何时使用Nonlocal关键字(声明使用外层非全局变量)定义和用法示例代码何时使用特别注意:nonlocal无法入侵模块级别的作用域Global与Nonlocal的比较主要区别-`global`声明全局作用域中的变量。-`nonlocal`声明非全局的外层作用域中的变量。使用场景-使用`global`适合那些需要跨多个函数操作或维护全局状态的场景。-使用`nonlocal`适合那些在嵌套函数间共享或修改变量的场景。实际应用nonlocal计数器实例(可以统计函数被调用了多少次)其他应用global全局配置示例Python中的Global和Nonlocal关键字概述在Python编程中,global和nonlocal关键字是用来在函数或其他块中修改外部作用域变量的。这两个关键字在管理变量作用域时非常有用,尤其是在嵌套函数和大型项目中。本文将详细介绍这两个关键字的用法、区别以及实际应用场景。Global关键字(声明使用全局变量)定义和用法global关键字用于在函数内部声明变量为全局变量。当需要在一个函数内修改全局作用域中的变量时,就需要使用global关键字。示例代码x=10#全局变量defmodify_global():globalxx=20#修改全局变量modify_global()print(x)#输出:2012345678何时使用在需要从局部作用域改变全局变量的值时使用。这通常用在配置变量或状态变量上,这些变量需要跨多个函数调用共享。Nonlocal关键字(声明使用外层非全局变量)定义和用法nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。它主要用在嵌套函数中,当需要修改嵌套作用域内的变量时。示例代码defouter():y=10#外层函数中的局部变量definner():nonlocalyy=20#修改外层函数中的局部变量inner()returnyprint(outer())#输出:201234567891011何时使用在嵌套函数中需要修改上层函数作用域的变量时使用。这通常用于闭包和装饰器中,其中内部函数需要修改它的外部环境。特别注意:nonlocal无法入侵模块级别的作用域在Python中,nonlocal关键字用来在函数或其他作用域内修改外层(非全局)作用域的变量。nonlocal的关键特性是它不能用于修改模块级别的全局变量。nonlocal主要用于那些被嵌套在其他函数内部的函数中,允许这些内部函数修改更外层函数的局部变量。这里是一些关于nonlocal和它如何操作的关键点:局部作用域间的链接:nonlocal会在当前函数的上层作用域中寻找变量,直到它找到匹配的变量名或达到全局作用域(但不包括全局作用域)。如果在非全局的外层作用域中找到了变量,nonlocal将允许当前函数修改这个变量。不穿透全局作用域:nonlocal不会与全局作用域的变量进行绑定或修改。如果需要修改全局作用域中的变量,应使用global关键字。不用于模块级变量:由于nonlocal不穿透到全局作用域,所以它不能用于修改模块顶层定义的变量,即那些通常在脚本或模块最外层定义的变量。这些变量属于全局作用域。使用限制:如果nonlocal声明的变量在所有可能的外层局部作用域中都未被找到,Python将抛出一个SyntaxError。这样的设计有助于维护作用域的清晰界限,避免嵌套函数无意中干扰到全局变量,这对于大型程序的可维护性和错误追踪是非常有帮助的。例如,使用nonlocal可以在闭包或装饰器等特定的编程模式中灵活地操作变量,而不影响到全局状态。这样的行为使得Python的作用域管理既灵活又安全。Global与Nonlocal的比较主要区别-global声明全局作用域中的变量。-nonlocal声明非全局的外层作用域中的变量。使用场景-使用global适合那些需要跨多个函数操作或维护全局状态的场景。-使用nonlocal适合那些在嵌套函数间共享或修改变量的场景。实际应用nonlocal计数器实例(可以统计函数被调用了多少次)利用nonlocal实现一个简单的计数器,这显示了nonlocal在实际中的应用:defmake_counter():count=0defcounter():nonlocalcountcount+=1returncountreturncountercounter=make_counter()print(counter())#输出:1print(counter())#输出:212345678910111213此计数器每次调用时递增,而count变量因nonlocal的声明,使得内部函数counter()能够修改其值。其他应用nonlocal关键字的应用场景比较多样,除了用于计数器外,还常见于以下几个方面:状态保持:在嵌套函数中,如果需要保持状态且状态不应该为全局可见,nonlocal使得内部函数能够记住外层函数的状态,而不必将状态设置为全局变量。闭包中的数据封装:使用闭包封装私有数据,通过nonlocal实现数据的修改和访问控制。这在一些设计模式如工厂模式或构造函数中特别有用,可以通过闭包来创建有特定行为的函数实例。递归算法的辅助变量:在递归函数中,如果需要跨递归调用修改变量(如累加器或计数器),nonlocal可以用来修改嵌套函数外层作用域的变量。装饰器:在实现Python装饰器时,如果装饰器内部需要维护状态(例如记录函数调用次数或缓存函数结果),nonlocal可以在嵌套的装饰器函数中用来修改状态。global全局配置示例使用global来维护一个应用程序的全局配置状态:configuration={}definitialize_config():globalconfigurationconfiguration['theme']='Dark'configuration['timeout']=120initialize_config()print(configuration)#输出:{'theme':'Dark','timeout':120}123456789在这个例子中,全局字典configuration在函数initialize_config()中被修改,用来存储应用的配置信息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 20:12 , Processed in 0.443801 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表