说我有这些代码行
index = 1
test = lambda t : t[index]+1
index = 0
print(test([5, 0]))
结果为6,我希望结果为1。如何在不编写t[1]+1
(即使用变量)的情况下使lambda表达式内的索引静态?
答案 0 :(得分:1)
Python的闭包是 late绑定。这意味着在调用函数时会查询闭包中使用的变量的值。
为避免后期绑定效果,您可以将lambda与默认arg一起使用:
index = 1
test = lambda t, index=index: t[index]+1 # binds index at definition time
index = 0
print(test([5, 0])) # 1
答案 1 :(得分:1)
index
既不是test()
中的参数也不是局部变量,因此确实可以将其解析为非局部变量(+>在封闭范围内查找)。
简单的解决方案是使index
成为自变量test
的参数,并在定义时捕获index
的值。
index = 1
test = lambda t, _index=index: t[_index]+1
index = 0
print(test([5, 0]))
答案 2 :(得分:0)
您可以使用lambda
返回lambda
:
test = (lambda index: lambda t: t[index] + 1)(index)
通过这种方式,index
变量对于返回的lambda函数而言是本地的。
答案 3 :(得分:0)
您可以使用operator.itemgetter
创建一个可调用对象,该对象从列表中提取第 n 个项目:
from operator import itemgetter
index = 1
get_val = itemgetter(index)
test = lambda t: get_val(t) +1
index = 0
print(test([5, 0])) # 1
但是这里没有理由使用lambda
语句,您可以显式定义一个函数:
def test(t):
return get_val(t) + 1