我创建了一个返回变量指定值的函数。像
y = 1.
def f(x):
return y
我需要此函数作为函数对象来创建另一个对象
dist = dist.distribution(f, other_variables)
这很好用。但是,如果我想创建几个不同的分布对象(在y改变的意义上具有不同的函数f),如
dist = dist.distribution(f, other_variables)
y = 2.
dist2 = dist.distribution(f, other_variables)
然后,所有分发对象仅返回最后指定的值y。即。
dist.f()(1.)
>>>> 2.
dist2.f()(1.)
>>>> 2.
而不是预期的
dist.f()(1.)
>>>> 12.
dist2.f()(1.)
>>>> 2.
问题显然是,函数f仅在调用变量时才访问变量,而不是最初访问变量。
周围有办法吗? 我最终想要的是: 仅具有一个变量的函数(x,虽然在这种情况下不执行任何操作,但在其他情况下需要它),这将在创建分布时返回当前y的值。因此原则上我希望在分布的初始化时,给定的函数是深度复制的,在某种意义上,它不再受变量的任何变化的影响。 这可能吗?
答案 0 :(得分:6)
不要使用全局变量。也没有必要对该功能进行“深度复制”; y
全局不属于函数状态的所有。
使用提供范围值的函数工厂,或使用functools.partial()
为函数提供默认参数。
功能工厂:
def produce_f(y):
def f(x):
return y
return f
dist = dist.distribution(produce_f(1.), other_variables)
现在y
是f
的范围值,produce_f()
每次调用时都会返回 new f
,{{1存储为y
的单元格变量。
演示:
f
>>> f1 = produce_f(12.)
>>> f2 = produce_f(42.)
>>> f1('foo')
12.0
>>> f2('foo')
42.0
这里from functools import partial
def f(y, x):
return y
dist = dist.distribution(partial(f, 1.), other_variables)
生成一个新的callable,每次调用时都会调用partial(f, 1.)
,附加传入的任何额外参数。
演示:
f(1., ...)