Python嵌套函数中如何引用修改上一层函数的局部变量?
解决方案
你需要的能力Python已经原生支持,使用nonlocal关键字即可实现,修改后代码如下:
x = 0 def f(): c = 2 def g(): # 声明c来自上一层非全局作用域 nonlocal c c = 4 print(c) # 输出4 g() print(c) # 输出4,验证g中修改的就是f里的c变量 f()
原理解释
nonlocal关键字的作用就是声明当前变量不属于当前函数的局部作用域,也不属于最外层的全局作用域,而是向上追溯最近一层嵌套父函数的作用域中的同名变量,完全匹配你提到的「不直接跳转到全局作用域,只向上访问指定层级作用域变量」的需求。- 两个关键字的差异对比:
global:强制绑定最外层全局作用域的变量,无视所有嵌套层级nonlocal:绑定最近一层非全局的父作用域变量,不会触及全局作用域
注意事项
nonlocal只能在嵌套函数内部使用,在全局作用域或者最外层函数中声明会触发语法错误- 如果存在多层嵌套,
nonlocal只会匹配最近一层父作用域的同名变量,如果你需要访问更上层嵌套的变量,需要中间层级的函数也对目标变量做nonlocal声明 - Python 2版本没有
nonlocal关键字,这类场景可以通过可变容器曲线实现:比如将父函数的变量存在列表、字典这类可变对象中,内层函数直接修改可变对象的内部值即可,不需要重新绑定变量名,示例如下:
# Python 2兼容写法 def f(): c = [2] def g(): c[0] = 4 print(c[0]) g() print(c[0]) f()
内容的提问来源于stack exchange,提问作者ZPlaya7
相关产品推荐
相关产品推荐

