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
相关产品推荐
相关产品推荐

