如何防止在python中更改lamda函数的局部变量?
问题描述:
假设有人想创建一个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函数内使给输出没有任何差别。
答
惯用的伎俩,其历史可以在所有引进倒闭前,是使用“可选参数”:
demo_lamb = lambda left, right=right: print("INSIDE LAMB left == ", left, ",", "right == ", right)
当函数的定义,这是你想要什么默认参数进行评估。
你必须将变量绑定到lambda函数。 –
如果您使用的是'some_var = lambda',您不应该首先使用'lambda',否则**会失败**,这就是'lambda'是匿名的**。 –
问题是'right'不是局部变量,它是一个* free变量*关闭函数。问题是Python有词法范围,所以'right'总是指全局范围内的'right'。要做的最好的事情就是让它成为一个参数。此外,这与'lambda'函数无关,但**所有函数都以这种方式工作** –