Python中如何在嵌套函数内修改外层函数作用域的变量
问题原因
这里用错了作用域声明关键字:global的作用是声明变量属于模块全局作用域,和外层嵌套函数f()的内部局部变量没有关联。在嵌套函数b()中写global a时,Python会把b()里操作的a识别为全局层面的独立变量,和f()内部定义的初始值为1的局部变量a是两个完全独立的对象。调用b()时修改的是全局空间的a,f()执行print(a)时读取的始终是自身作用域内的局部a,因此最终输出1,和预期结果不符。
修复方法
将b()内的global替换为nonlocal关键字即可。nonlocal是专门用于嵌套函数场景的关键字,作用是声明当前变量来自最近一层的外层嵌套函数作用域,对该变量的修改会直接同步到外层函数的对应变量上。
修复后的代码:
def f(): a = 1 def b(): nonlocal a a = 2 b() print(a) f()
代码运行后会输出预期结果2。
两个关键字的适用场景
global:用于在函数内部修改模块全局作用域的变量nonlocal:用于在内层嵌套函数中修改外层嵌套函数的局部变量
内容的提问来源于stack exchange,提问作者Asmita Poddar
相关产品推荐
相关产品推荐

