如何修改lambda函数内的变量?

emK*_*oly 3 python lambda python-3.x

我想做这样的事情:

def myFunc(y):
    aVariable = "a"
    bVariable = "b"
    y(aVariable,bVariable)

def main():
    myFunc(lambda a,b: a+=b)
Run Code Online (Sandbox Code Playgroud)

并期望输出"ab".

相反,我收到以下错误:

File "<stdin>", line 7
  myFunc(lambda x, y: x += y)
                        ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

Jim*_*ard 7

函数体中只允许表达式lambda ; a += b是一个扩充的赋值语句,在编译时,这将导致a SyntaxError语法不允许它.

您可以将其更改为仅返回添加:

lambda a,b: a+b
Run Code Online (Sandbox Code Playgroud)

然后继续设置调用它的结果a:

a = y(aVariable,bVariable)
Run Code Online (Sandbox Code Playgroud)

您当然可以使用用于该操作的函数.虽然你可以直接做lambda a, b: a.__iadd__(b),但这是笨重的,使用这样的dunders不是最好的做法.相反,您应该使用operator模块中的相应操作.

iadd从功能operator允许你绕过这个"限购"如果你真的需要.函数调用是表达式,因此,允许它们在lambda函数的主体中使用它们.import需要简单:

from operator import iadd
Run Code Online (Sandbox Code Playgroud)

然后,重新定义lambda传递myFunc给使用iadd:

myFunc(lambda a,b: iadd(a, b))
Run Code Online (Sandbox Code Playgroud)

将所有这些添加在一起,同时还添加适当的returns myFuncmain:

from operator import iadd

def myFunc(y):
    aVariable = "a"
    bVariable = "b"
    return y(aVariable,bVariable)

def main():
    return myFunc(lambda a,b: iadd(a, b))
Run Code Online (Sandbox Code Playgroud)

调用ab时的结果main.