2017-10-09 101 views
1

假设有人想创建一个lambda函数,并且他们希望lambda函数中的所有内容(除了输入参数)都被视为一个函数的局部变量。他们将如何实现这一目标?通过说变量是“本地的”,我的意思是没有从lambda函数外部访问这些变量。如何防止在python中更改lamda函数的局部变量?

代码

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并用copy.deepcopy(right)替换right lambda函数内使给输出没有任何差别。

+0

你必须将变量绑定到lambda函数。 –

+2

如果您使用的是'some_var = lambda​​',您不应该首先使用'lambda',否则**会失败**,这就是'lambda'是匿名的**。 –

+0

问题是'right'不是局部变量,它是一个* free变量*关闭函数。问题是Python有词法范围,所以'right'总是指全局范围内的'right'。要做的最好的事情就是让它成为一个参数。此外,这与'lambda'函数无关,但**所有函数都以这种方式工作** –

回答

1

惯用的伎俩,其历史可以在所有引进倒闭前,是使用“可选参数”:

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

当函数的定义,这是你想要什么默认参数进行评估。

相关问题