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

Python:如何让内部函数捕获创建时的非局部变量值?

问题

我有如下外部函数返回内部函数的代码:

def outer():
    outer_var = 1

    def inner():
        return outer_var

    outer_var = 2
    return inner

调用outer()()会返回2,但我希望内部函数返回创建它时outer_var的值,而非调用时的值。

我想到的唯一解决方案是:

def outer():
    outer_var = 1

    def inner(inner_var=outer_var):
        return inner_var

    outer_var = 2
    return inner

此时调用outer()()会返回1。请问有没有无需使用关键字参数的更好方案?实际场景中outer_var的值仅在运行时可知。

解决方案

方案1:通过嵌套函数捕获瞬时值

新增一个专门的创建函数,在生成inner时把当前的outer_var值传递进去,让inner绑定这个固定值:

def outer():
    outer_var = 1

    def make_inner(val):
        def inner():
            return val
        return inner

    inner = make_inner(outer_var)
    outer_var = 2
    return inner

调用outer()()会返回1——inner引用的是make_inner的参数val,这个值在make_inner调用时就被固定为当时的outer_var,后续修改outer_var不会影响它。

方案2:用functools.partial绑定参数

借助functools.partial直接把当前值绑定到函数参数上,生成一个无需传参的新函数:

from functools import partial

def outer():
    outer_var = 1

    def inner(val):
        return val

    inner = partial(inner, outer_var)
    outer_var = 2
    return inner

这里partial会把调用时的outer_var值(1)绑定到inner的参数中,返回的新函数调用时直接返回这个绑定值,不受后续outer_var修改的影响。

方案3:用类实现可调用对象保存值

定义一个简单的类,在实例化时保存当前的outer_var,通过__call__方法让实例可以像函数一样被调用:

def outer():
    outer_var = 1

    class InnerCallable:
        def __init__(self, val):
            self.val = val
        def __call__(self):
            return self.val

    inner = InnerCallable(outer_var)
    outer_var = 2
    return inner

调用outer()()时,实例会返回初始化时保存的1,后续outer_var的变化不会影响实例内部存储的值。

这些方案的核心都是在创建可调用对象(inner)的瞬间,把当时的outer_var值“快照”下来,避免后续变量修改带来的影响,都不需要依赖关键字参数来实现。

内容的提问来源于stack exchange,提问作者uzumaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:32