Discuss / Python / 返回匿名函数时通常不加参数

返回匿名函数时通常不加参数

Topic source

极大似然

#1 Created at ... [Delete] [Delete and Lock User]

陈述:通过def自定义函数返回一个匿名函数时,匿名函数前通常不加参数,加参数后在调用时不注意的话会报错。

原因:python的作用域是链式结构,子对象会一级一级向上寻找父对象的变量,当lambda函数前加了参数时,尽管它的参数名称与外层的def函数相同,但实质上它们被作用域隔离开了。

另外:我的理解是函数调用时传入参数实质上是一个赋值的过程,闭包内如果要对外层函数的变量赋值,需要先nonlocal声明。

反例:

def my_add(a, b):

    return lambda a, b : a + b  #由于作用域的原因,这里的a和b与my_add函数中的a和b是隔离开的。

print(my_add(1, 2)()) #期待打印出3,但实际会报错,英文lambda函数没有传入参数。

print(my_add(1, 2)(3, 4)) #会打印出7,因为my_add函数传入的1和2根本没有被lambda函数读取。

正例:

def my_add(a, b):

    return lambda : a + b  #子对象lambda没有a和b,会在父对象my_add中读取到。

print(my_add(1, 2)()) #将打印3


  • 1

Reply