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

Python lambda绑定到本地值

Python lambda绑定到本地值

Qyouu 2019-08-02 17:03:54
Python lambda绑定到本地值以下代码吐出1两次,我期望看到0然后1def pv(v) :   print vdef test() :   value = []   value.append(0)   value.append(1)   x=[]   for v in value :     x.append(lambda : pv(v))   return x x = test()for xx in x:   xx()我希望python lambdas绑定到一个局部变量指向的引用,在场景后面。然而,情况似乎并非如此。我已经在一个大型系统中遇到了这个问题,其中lambda正在做现代C ++的一个绑定的等价物(例如'boost :: bind'),在这种情况下,你将绑定到智能ptr或复制contstruct lambda的副本。那么,如何将局部变量绑定到lambda函数并在使用时保留正确的引用?我对这种行为非常惊讶,因为我不希望这种语言来自垃圾收集器。有问题的代码如下所示(l3_e是导致问题的变量): for category in cat :       for l2 in cat[category].entries :         for l3 in cat[category].entries[l2].entry["sub_entries"] :           l3_e = cat[category].entries[l2].entry["sub_entries"][l3]           url = "http://forums.heroesofnewerth.com/" + l3_e.entry["url"]           self.l4_processing_status[l3_e] = 0           l3_discovery_requests.append( Request(             url, callback = lambda response : self.parse_l4(response,l3_e)))           print l3_e.entry["url"]     return l3_discovery_requests
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

更改x.append(lambda : pv(v))x.append(lambda v=v: pv(v))

你希望“python lambdas绑定到一个局部变量指向的引用,在场景后面”,但这不是Python的工作原理。Python在调用函数时查找变量名称,而不是在创建函数时查找。使用默认参数是有效的,因为默认参数在创建函数时计算,而不是在调用函数时计算。

这对lambdas来说并不特别。考虑:

x = "before foo defined"def foo():
    print x
x = "after foo was defined"foo()

版画

after foo was defined


查看完整回答
反对 回复 2019-08-02
  • 2 回答
  • 0 关注
  • 458 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信