Python中nonlocal关键字能否重复引用更高层级作用域中的名称?
关于Python中
nonlocal关键字的层级访问问题 在Python里,nonlocal关键字无法通过重复使用来逐层访问更高层级的嵌套作用域。
核心原理
nonlocal的作用是将变量绑定到当前函数最近的外层封闭作用域(注意不能是全局作用域)中已存在的同名变量。它只能指向离当前作用域最近的那个外层变量,没办法跳过中间的嵌套层直接访问更外层的变量。
示例验证
先看一个多层嵌套的例子:
def outer(): spam = "外层的spam" def middle(): spam = "中间层的spam" def inner(): nonlocal spam # 这里绑定的是middle里的spam,而非outer的 spam = "内层修改后的spam" inner() print(f"中间层作用域的spam: {spam}") middle() print(f"外层作用域的spam: {spam}") outer()
运行结果:
中间层作用域的spam: 内层修改后的spam 外层作用域的spam: 外层的spam
可以看到,inner里的nonlocal spam只找到了最近的middle作用域中的spam,并没有触及最外层的变量。
如何访问更外层的变量
如果想要访问更外层的嵌套变量,需要在中间的作用域也显式使用nonlocal,把变量的绑定关系传递下去:
def outer(): spam = "外层的spam" def middle(): nonlocal spam # 绑定外层outer的spam def inner(): nonlocal spam # 此时绑定的就是outer的spam spam = "内层修改了外层的spam" inner() print(f"中间层作用域的spam: {spam}") middle() print(f"外层作用域的spam: {spam}") outer()
运行结果:
中间层作用域的spam: 内层修改了外层的spam 外层作用域的spam: 内层修改了外层的spam
这种方式并不是重复使用nonlocal来“跳跃”层级,而是每层都明确声明要绑定外层的变量,从而让内层能访问到最外层的目标变量。
原示例的补充说明
你提供的原示例验证了nonlocal可以访问直接外层的变量:
def scope_test(): def do_nonlocal(): nonlocal spam spam = 'nonlocal spam' spam = 'test spam' do_nonlocal() print(f'after nonlocal assignment spam={spam}') scope_test() # 输出: 'after nonlocal assignment spam=nonlocal spam'
这里do_nonlocal里的nonlocal spam直接绑定了scope_test作用域中的spam,这是因为两者是直接嵌套的层级,没有中间层干扰。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

