在Python中使用lambda函数会导致无限递归问题。

4

我有一个类,它包含一个函数。我想按照相同的方式每隔一段时间更改这个函数。如果我使用lambda,就会出现无限递归。我知道出现这种情况的原因,我希望找到一种优雅的解决方案。

def func(s):
    return  1 # some not interesting function

class cls: # a class

    def __init__(self , f):
    self.f = f

c = cls(func)
c.f = lambda x: c.f(x) + 1 #  i want c.f to return c.f(x) + 1
print(c.f(1)) # causes infinite recursion

我不想去做

c.f = lambda x: func(x) + 1 

因为我希望能够多次以相同的方式更改c.f

1个回答

8
无限递归的原因是在lambda函数内部,c.f在调用时被解析,因此它已经是“新”的lambda函数,而不是传递给cls.__init__的原始函数。你可以尝试像下面这样做:
c.f = lambda x, f=c.f: f(x) + 1

由于默认参数是在创建 lambda 函数时计算的,因此它将是类中原始函数的默认参数。


这个有效,谢谢。但我不知道它在做什么。能否给一些解释或参考资料? - Yair Daon
1
@YairDaon -- 我已经解释了... f=c.f 在 lambda 函数被 创建 时被评估,而不是在调用时,因此传递给函数的 fc.f(原始值)。 - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接