如何防止 lamda 函数局部变量在 python 中更改



>假设有人想要创建一个lambda函数,并且他们希望lambda函数中的所有内容(输入参数除外)都被视为函数的局部变量。他们将如何实现这一目标?通过说变量是"局部的",我的意思是无法从 lambda 函数外部访问这些变量。

法典

right = 5
demo_lamb = lambda left : print("INSIDE  LAMB left == ", left, ",", "right == ", right)
for lt in range(0, 5):
    demo_lamb(lt)
    right = 100*lt + 99
    print("OUTSIDE LAMB              right == ", right)

打印输出

INSIDE  LAMB left ==  0 , right ==  5
OUTSIDE LAMB              right ==  99
INSIDE  LAMB left ==  1 , right ==  99
OUTSIDE LAMB              right ==  199
INSIDE  LAMB left ==  2 , right ==  199
OUTSIDE LAMB              right ==  299
INSIDE  LAMB left ==  3 , right ==  299
OUTSIDE LAMB              right ==  399
INSIDE  LAMB left ==  4 , right ==  399
OUTSIDE LAMB              right ==  499       

期望的输出

INSIDE  LAMB left ==  0 , right ==  5
OUTSIDE LAMB              right ==  99
INSIDE  LAMB left ==  1 , right ==  5
OUTSIDE LAMB              right ==  199
INSIDE  LAMB left ==  2 , right ==  5
OUTSIDE LAMB              right ==  299
INSIDE  LAMB left ==  3 , right ==  5
OUTSIDE LAMB              right ==  399
INSIDE  LAMB left ==  4 , right ==  5
OUTSIDE LAMB              right ==  499

我们如何将 lambda 函数内所有变量(输入参数除外)的值"冻结"为创建 lambda 函数时的值?

一个失败的解决方案

导入 copy 并将 lambda 函数内的right替换为 copy.deepcopy(right) 对输出没有任何影响。

通常的技巧,可以追溯到引入闭包之前,是使用"可选参数":

demo_lamb = lambda left, right=right: print("INSIDE  LAMB left == ", left, ",", "right == ", right)

定义函数时会计算默认参数,这正是您想要的。

最新更新