为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2021-05-30 17:34:01
说我有这些代码行index = 1test = lambda t : t[index]+1index = 0print(test([5, 0]))结果是 6,我希望结果是 1。如何在不写的情况下使 lambda 表达式中的索引静态化t[1]+1,即使用变量?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

Python 的闭包是后期绑定的。这意味着在调用函数时会查找闭包中使用的变量的值。


为了避免后期绑定效果,您可以使用带有默认参数的 lambda:


index = 1

test = lambda t, index=index: t[index]+1  # binds index at definition time

index = 0

print(test([5, 0]))  # 1


查看完整回答
反对 回复 2021-06-09
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

index既不是参数也不是局部变量,test()因此它确实被解析为非局部变量(+> 它在封闭范围内查找)。


简单的解决方案是使用默认值创建index一个参数,test捕获index定义时的值:


index = 1

test = lambda t, _index=index: t[_index]+1

index = 0

print(test([5, 0])) 


查看完整回答
反对 回复 2021-06-09
?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以使用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


查看完整回答
反对 回复 2021-06-09
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号