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

Python中最内层函数如何访问最外层函数的非局部变量?

让inner()访问outer()中非局部变量x的方法

在你给出的场景中,middle()内部定义了同名变量x=5,这会遮蔽outer()中的x=0。默认情况下,inner()里的nonlocal x只会绑定到最近的外层作用域(也就是middle())的x,无法直接跳过中间层访问outer()的x。以下是几种可行的解决方式:

方法1:用可变对象包装x

将outer()中的x存入可变容器(比如列表),这样中间层的同名局部变量不会影响容器本身,inner()可以直接修改容器内的元素:

def outer():
    x = [0]  # 用列表包装x,转为可变对象
    def middle():
        x = 5  # 此处x为middle的局部变量,与outer的x列表无冲突
        def inner():
            x[0] += 1
            print(x[0])  # 输出1
        inner()
    middle()
outer()

方法2:利用函数属性存储x

把x设为outer()函数的属性,通过函数对象直接访问,不受中间层变量遮蔽影响:

def outer():
    outer.x = 0  # 将x定义为outer函数的属性
    def middle():
        x = 5
        def inner():
            outer.x += 1
            print(outer.x)  # 输出1
        inner()
    middle()
outer()

方法3:通过参数传递outer()的x引用

给middle()添加参数接收outer()的x,再在inner()中用nonlocal绑定该参数:

def outer():
    x = 0
    def middle(outer_x):  # 接收outer的x作为参数
        x = 5
        def inner():
            nonlocal outer_x  # 绑定到middle的outer_x参数,即outer的x
            outer_x += 1
            print(outer_x)  # 输出1
        inner()
    middle(x)
outer()

方法4:用类封装状态替代嵌套函数

如果嵌套层级复杂,用类管理状态会更清晰:

class Outer:
    def __init__(self):
        self.x = 0
    
    def middle(self):
        x = 5  # 局部变量,不影响实例的x属性
        def inner():
            self.x += 1
            print(self.x)  # 输出1
        inner()

outer = Outer()
outer.middle()

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:55:29