Python嵌套函数内修改外层函数局部变量的实现方法
问题根因
原代码的作用域声明写错了:内层hi()函数里的global x,会让Python把x识别为模块全局作用域的变量,和myfunc内部一开始定义的局部变量x完全是两个互不干扰的变量。调用hi()的时候改的是全局x,外层两次print读的都是myfunc里初始值为空串的局部x,自然两次输出都是Python is ,达不到第二次输出带OMG的预期。
修复方法
按照约束(不能把x声明为全局变量、仅修改myfunc内部代码),只需要把内层函数里的global换成nonlocal就行。nonlocal是Python嵌套函数场景专用的关键字,用来声明当前变量指向的是外层嵌套函数(非全局)的局部变量,对内层x的修改会直接同步到外层的x变量上。
修复后可直接运行的代码:
def myfunc(): x = "" print("Python is " + x) def hi(): nonlocal x x = "OMG" hi() print("Python is " + x) myfunc()
运行后输出:
Python is Python is OMG
完全符合预期效果。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

