我创建了一个函数,它返回一个由变量指定的值。喜欢
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 的值。所以原则上我希望在分布的初始化时,给定的函数被深度复制,从某种意义上说,它不再受到任何变量变化的影响。 这可能吗?
最佳答案
不要为此使用全局变量。也不需要“深度复制”该功能; 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
每次调用时,y
都存储为 f
的单元格变量。
演示:
>>> f1 = produce_f(12.)
>>> f2 = produce_f(42.)
>>> f1('foo')
12.0
>>> f2('foo')
42.0
使用 functools.partial()
:
from functools import partial
def f(y, x):
return y
dist = dist.distribution(partial(f, 1.), other_variables)
此处 partial(f, 1.)
生成一个新的可调用对象,无论何时调用它都会调用 f(1., ...)
,附加传入的任何额外参数.
演示:
>>> f1 = partial(f, 12.)
>>> f2 = partial(f, 42.)
>>> f1('foo')
12.0
>>> f2('foo')
42.0
关于python - 如何深度复制函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936626/