如何深度复制一个函数对象

时间:2013-04-10 21:19:56

标签: python deep-copy

我创建了一个返回变量指定值的函数。像

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的值。因此原则上我希望在分布的初始化时,给定的函数是深度复制的,在某种意义上,它不再受变量的任何变化的影响。 这可能吗?

1 个答案:

答案 0 :(得分:6)

不要使用全局变量。也没有必要对该功能进行“深度复制”; y全局不属于函数状态的所有

使用提供范围值的函数工厂,或使用functools.partial()为函数提供默认参数。

功能工厂:

def produce_f(y):
    def f(x):
        return y
    return f

dist = dist.distribution(produce_f(1.), other_variables)

现在yf的范围值,produce_f()每次调用时都会返回 new f,{{1存储为y的单元格变量。

演示:

f

使用functools.partial()

>>> 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., ...)