2024-04-26 04:42:03 发布
网友
我想我的问题应该通过这个简短的代码更清楚地理解:
fs = [] for k in range(0, 10): def f(x): return x + 2*k fs.append(f) fs[0](1) # expecting 1 but 19(=1+2*9)
如何让f返回我想要的?请注意,f不能将k作为参数接收。你知道吗
f
k
(实际上我要做的是准备multiple constraint functions that are fed to scipy.optimize.minimize)
解决这个问题的典型方法是:
def f(x, k=k): return x + 2*k
在大多数情况下,这不应该影响“f cannot receivek as a argument”条件,因为它不是必需的参数。你知道吗
一种相关但不同的方法是在循环外定义f。你知道吗
def f(k, x): return x + 2*k
然后在循环中使用functools.partial。你知道吗
import functools fs = [] for k in range(10): fs.append(functools.partial(f, k))
在这种方法中,即使尝试传递值,函数也不会接受k的值。你知道吗
基本上,问题是在这种情况下,变量k会随着循环的迭代而不断变化。这意味着所有指向变量“k”的东西在任何时候都指向同一个值。你知道吗
有几种方法可以解决这个问题。这也许是最常见的。你知道吗
def f(x, k=k): # This sets k as a locally bound variable which is evaluated # at the time the function is created. return x + 2*k
不利之处在于,此解决方案将允许后面的函数使用不同的k值调用新创建的函数。这意味着您可以调用f("cat","dog"),并将"catdogdog"作为返回。虽然这不是世界末日,但肯定不是有意的。你知道吗
f("cat","dog")
"catdogdog"
但是,您也可以这样做:
def f_maker(k): # Create a new function whose variable "k" does not exist in outside scope. def f(x): return x + 2*k return f fs = [] for k in range(0, 10): fs.append(f_maker(k)) fs[0](1)
解决这个问题的典型方法是:
在大多数情况下,这不应该影响“f cannot receivek as a argument”条件,因为它不是必需的参数。你知道吗
一种相关但不同的方法是在循环外定义
f
。你知道吗然后在循环中使用functools.partial。你知道吗
在这种方法中,即使尝试传递值,函数也不会接受
k
的值。你知道吗基本上,问题是在这种情况下,变量k会随着循环的迭代而不断变化。这意味着所有指向变量“k”的东西在任何时候都指向同一个值。你知道吗
有几种方法可以解决这个问题。这也许是最常见的。你知道吗
不利之处在于,此解决方案将允许后面的函数使用不同的k值调用新创建的函数。这意味着您可以调用
f("cat","dog")
,并将"catdogdog"
作为返回。虽然这不是世界末日,但肯定不是有意的。你知道吗但是,您也可以这样做:
相关问题 更多 >
编程相关推荐