如何使python lambda表达式的索引静态

时间:2018-09-03 13:22:24

标签: python indexing lambda

说我有这些代码行

index = 1
test = lambda t : t[index]+1
index = 0
print(test([5, 0]))

结果为6,我希望结果为1。如何在不编写t[1]+1(即使用变量)的情况下使lambda表达式内的索引静态?

4 个答案:

答案 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