我在Python中编写一些科学代码,解决了一个复杂的优化问题,并且(理想情况下)返回一个单变量函数列表,这些函数是特定时间点问题的一系列解决方案(时间列表 - 索引,单变量政策函数,如果你愿意的话)。
函数列表需要独立于创建它的对象。这就是我遇到麻烦的地方 - 不可避免地,列表中的每个函数都需要引用一个已解决的值并存储在求解器对象的列表中。
这是一个快速的小程序,说明了我遇到的问题:
class test:
def __init__(self):
self.vals = np.arange(5)
def testfxns(self):
fxns = {}
for i in range(len(self.vals)):
def temp_func(x):
Z = self.vals[i]
return Z + x
fxns[i] = temp_func
#del temp_func # doesn't help
return fxns
t1 = test()
z = t1.testfxns()
print z[0](2)
print z[1](2)
print z[2](2)
print z[3](2)
print z[4](2)
打印报表的输出全部是6 - 我希望它是2,3,4,5,6。
有没有办法解决这个问题?我需要" Z"中的那些常数。要插入到函数列表的每次迭代中的变量。穷人"穷人"解决方案是打印出每个常量值,然后只需手动输入函数列表,手动将我需要的常量值输入到不同的单个函数定义中。
有没有办法获得" self.vals [i]"在" dereferenced"方式,编程? (希望这是有道理的。)或者,甚至是解决这个问题的术语是什么 - 我应该在文档中搜索和/或研究哪些术语? (有些麻烦甚至不知道在哪里看。)
非常感谢。我知道我可能会遇到多个问题,所以所有帮助/指导都会受到赞赏。
答案 0 :(得分:3)
这是闭包的常见问题。调用函数时会获取i
的值,而不是在创建函数时。解决方案是将其作为关键字提供:
def temp_func(x, i=i):
Z = self.vals[i]
return Z + x
当创建函数时,关键字会被评估(并存储在函数对象上),而不是 。