循环生成含不同i值的Am函数并存入函数向量的问题求助
解决Python循环中函数绑定变量延迟的问题
问题核心是Python闭包的延迟绑定特性:你定义的Am函数并非在定义时捕获i的当前值,而是在函数被调用时才去查找i的最新值。循环结束后i固定为1,因此两个函数调用时都会使用这个最终值。
以下是两种可行的修复方案:
方案1:用默认参数绑定当前循环值
在循环内部定义函数,通过默认参数把当前循环的i值直接绑定到函数中(默认参数会在函数定义时求值):
Afunctions = [] # 假设xn和h1是已定义的变量,这里给出示例值 xn = [0, 1, 2, 3] h1 = 1 for i in range(0, 2): def Am(x, i=i): # 绑定当前循环的i值到默认参数 if xn[i] < x <= xn[i+1]: return (x - xn[i]) / h1 elif xn[i+1] < x < xn[i+2]: return 1 - (x - xn[i+1]) / h1 else: return 0 Afunctions.append(Am)
方案2:使用工厂函数创建独立闭包
通过一个外层工厂函数,每次传入当前的i,让内部的Am函数捕获该值的独立副本:
Afunctions = [] xn = [0, 1, 2, 3] h1 = 1 def create_am_function(i): def Am(x): if xn[i] < x <= xn[i+1]: return (x - xn[i]) / h1 elif xn[i+1] < x < xn[i+2]: return 1 - (x - xn[i+1]) / h1 else: return 0 return Am for i in range(0, 2): Afunctions.append(create_am_function(i))
验证效果:调用Afunctions[0](1.5)会使用i=0的逻辑,Afunctions[1](2.5)会使用i=1的逻辑,两个函数不再共享同一个i值。
内容的提问来源于stack exchange,提问作者Salvador Falcón Canillas
相关产品推荐
相关产品推荐

