python - 如何深度复制函数对象

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

最佳答案

不要为此使用全局变量。也不需要“深度复制”该功能; 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 每次调用时,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/

相关文章:

单元测试的 Python 覆盖率

javascript - Ruby => Javascript 翻译

python - MongoEngine 抛出异常 TypeError : cannot deepcopy this pattern object

C++ 复制构造函数,谁能解释为什么?

python - 更新多对多关系

python - 在 rdflib 中使用上下文

python - 如何显示 PyQt 模式对话框并在关闭后从其控件中获取数据?

android - Appium - 在第一次测试和最后一次测试时清除应用程序状态,但在测试之间不清除

python - DFS 中(非常慢的)深度复制的任何替代方法?

c - allegro5,C - 在循环中显示位图的副本