Python 如何在没有赋值和组合的情况下更改lambda表达式的功能?

Python 如何在没有赋值和组合的情况下更改lambda表达式的功能?,python,lambda,Python,Lambda,给定表达式f=lambda x:x+x,是否可以通过使用单行表达式编辑f的功能,从而获得以下结果: f(7) = 14 `the expression subtracts one from the return value of f` f(7) = 13 您只需重新指定f,但是,只在一行中执行此操作将非常棘手,因为您需要保留对旧lambda的引用: old_f = f f = lambda x: old_f(x) - 1 您可以为此使用闭包: f = (lambda old_f: (lamb

给定表达式
f=lambda x:x+x
,是否可以通过使用单行表达式编辑
f
的功能,从而获得以下结果:

f(7) = 14
`the expression subtracts one from the return value of f`
f(7) = 13

您只需重新指定
f
,但是,只在一行中执行此操作将非常棘手,因为您需要保留对旧
lambda的引用:

old_f = f
f = lambda x: old_f(x) - 1
您可以为此使用闭包:

f = (lambda old_f: (lambda x: old_f(x) - 1))(f)

您可以使用默认参数值通过闭包保留以前的函数,而无需引入任何新变量:

f = lambda x: x*2
print f(7)  # --> 14

f = (lambda prev_f=f: (lambda x: prev_f(x) - 1))(f)
print f(7)  # --> 13

不错,但是与lamba x:x+x-1相比,您所付出的代价可能只是性能上的一点小小的损失。这不是一个要求;)。性能损失最有可能达到100%,因为函数调用是这里最主要的操作,对于修改后的
f
,您正在调用两个函数(
f
old\u f
).你能解释一下使用这个解决方案时在范围级别发生了什么吗?@Medvednic他正在构建一个新的lambda,它内部保存着旧的lambda。因此,您无法再访问旧lambda,但新lambda可以。两者都还在记忆中,都被使用过。你以前看到过Filmer的答案吗?看起来很相似。@Trilarion:是的,我看到了filmor的答案,答案很相似,但并不完全相同。区别在于它不需要事先单独的
prev_f=f
语句,因此它实际上是一个单行解决方案。