Python循环内定义并装饰的函数出现变量晚绑定问题如何解决
你遇到的是Python闭包延迟绑定的典型问题:循环内定义的函数捕获的是变量本身而非定义时刻的变量值,只有函数实际调用时才会读取变量的当前值,此时循环已执行完毕,type_str固定为最后一次迭代的type_3。
解决方案1:函数工厂(推荐,无歧义)
通过额外的函数封装创建独立作用域,每次迭代将当前type_str绑定到对应作用域中:
# 定义函数工厂,接收当前迭代的type_str作为参数 def create_executor(type_str: str): @decorator_exec.register(...) def to_exec(num: int): print(type_str, num) return to_exec for type_str in ["type_1", "type_2", "type_3"]: # 每次迭代调用工厂函数,将当前type_str绑定到独立作用域 create_executor(type_str)
解决方案2:默认参数绑定(简洁)
利用Python函数默认参数在定义阶段求值的特性,直接绑定当前迭代的type_str:
for type_str in ["type_1", "type_2", "type_3"]: @decorator_exec.register(...) # 新增默认参数type_str=type_str,定义时就绑定当前迭代的变量值 def to_exec(num: int, type_str=type_str): print(type_str, num)
注意:该方案的限制是后续调用函数时不能传入第二个参数,否则会覆盖绑定的
type_str值,如果你能保证调用时仅传入num一个参数,该方案更简洁易用。
两种方案运行后调用函数列表,均可得到你期望的输出:
type_1 0 type_2 1 type_3 2
内容的提问来源于stack exchange,提问作者user15152861
相关产品推荐
相关产品推荐

