在Python中将变量赋值给本地函数范围

时间:2013-05-15 08:02:33

标签: python lambda

我想将变量分配给多次调用的lambda的范围。每次都有一个新的变量实例。我该怎么做?

f = lambda x: x + var.x - var.y

# Code needed here to prepare f with a new var

result = f(10)

在这种情况下,我希望在不将其作为第二个参数的情况下替换每个调用。

4 个答案:

答案 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或常规函数,可以通过参数更改函数范围内变量的唯一方法。