You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:14:51