我想将变量分配给多次调用的lambda的范围。每次都有一个新的变量实例。我该怎么做?
f = lambda x: x + var.x - var.y
# Code needed here to prepare f with a new var
result = f(10)
在这种情况下,我希望在不将其作为第二个参数的情况下替换每个调用。
答案 0 :(得分:8)
lambda
范围内未定义的变量是从调用范围调用的。
一个稍微简单的例子......
>>> y = 1
>>> f = lambda x: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
3
...所以你只需要在调用var
之前在调用范围内设置lambda
,尽管在y
为'常数'的情况下这种情况更常用。< / p>
该功能的反汇编显示......
>>> import dis
>>> dis.dis(f)
1 0 LOAD_FAST 0 (x)
3 LOAD_GLOBAL 0 (y)
6 BINARY_ADD
7 RETURN_VALUE
如果你想在定义y
时将lambda
绑定到一个对象(即创建一个closure),通常会看到这个成语...
>>> y = 1
>>> f = lambda x, y=y: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
2
...定义y
后对lambda
的更改无效。
该功能的反汇编显示......
>>> import dis
>>> dis.dis(f)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_ADD
7 RETURN_VALUE
答案 1 :(得分:1)
f = functools.partial(lambda var, x: x + var.x - var.y, var)
将为您提供一个参数(f
)的函数(x
),其中var
固定为定义时的值。>
答案 2 :(得分:0)
您不能在lambda表达式中使用赋值语句,因此您必须使用常规命名函数:
def f(x):
global var
var = x
请注意使用“global”关键字。没有它,Python会假设你想在函数的本地范围内创建一个新的“var”变量。
答案 3 :(得分:-1)
再设一个参数:
f = lambda x,var: x + var.x - var.y
result = f(10, var)
Lambda或常规函数,可以通过参数更改函数范围内变量的唯一方法。