关于lambda:在Python中将变量赋值给本地函数范围

Assign variable to local scope of function in Python

我想给一个lambda的作用域分配一个变量,这个lambda被多次调用。每次都有一个新的变量实例。我该怎么做?

1
2
3
4
5
f = lambda x: x + var.x - var.y

# Code needed here to prepare f with a new var

result = f(10)

在本例中,它是var,我希望在每次调用时都替换它,而不将其作为第二个参数。


lambda的作用域中未定义的变量是从调用它的点的调用作用域中解析出来的。

一个稍微简单的例子…

1
2
3
4
5
6
7
>>> y = 1
>>> f = lambda x: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
3

…所以,在调用你的lambda之前,你只需要在调用范围中设置var,尽管在y是"常量"的情况下,这更常用。

该函数的反汇编显示…

1
2
3
4
5
6
>>> import dis
>>> dis.dis(f)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_GLOBAL              0 (y)
              6 BINARY_ADD
              7 RETURN_VALUE

如果您想在定义lambda时将y绑定到一个对象(即创建一个闭包),通常会看到这个习语…

1
2
3
4
5
6
7
>>> y = 1
>>> f = lambda x, y=y: x + y
>>> f(1)
2
>>> y = 2
>>> f(1)
2

…因此,在定义lambda后,对y的更改没有效果。

该函数的反汇编显示…

1
2
3
4
5
6
>>> import dis
>>> dis.dis(f)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 BINARY_ADD
              7 RETURN_VALUE


f = functools.partial(lambda var, x: x + var.x - var.y, var)将为您提供一个参数(x的函数(f,其中var固定在定义点的值上。


不能在lambda表达式中使用赋值语句,因此必须使用正则命名函数:

1
2
3
def f(x):
    global var
    var = x

注意使用"global"关键字。如果没有它,python将假定您想要在函数的本地范围内创建一个新的"var"变量。


使其成为另一个参数:

1
2
f = lambda x,var: x + var.x - var.y
result = f(10, var)

lambda或正则函数,在函数范围内更改变量的唯一方法是通过参数。