当前位置: 首页 > 面试题库 >

Python Lambda绑定到本地值

齐驰
2023-03-14
问题内容

以下代码吐出1两次,我希望看到0然后1

def pv(v) :
  print v


def 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 ++的bind等效操作(例如’boost :: bind’),在这种情况下,你将绑定到智能ptr或copy构造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

问题答案:

更改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


 类似资料:
  • 我正在努力让Android上的OkHttpClient使用自定义证书发出HTTPS请求,同时绑定到特定网络接口的本地地址。我当前的尝试使用以下: 类实现为: 这主要是基于OkHttp GitHub站点的留档,它描述了如何将值传递给允许我们通过覆盖无参数的方法将每个套接字绑定到特定地址。但是,sslSocketFactory的文档没有提到任何关于能够绑定套接字的内容。当我使用上述代码运行我的应用程序

  • 问题内容: 我如何将expressjs服务器绑定到特定IP 就像是 等效于nodejs: 问题答案: 在调用listen时,ExpressJS 会将参数向下传递给模块,因此您的示例应该可以正常工作。 不是吗?

  • 我的谷歌地图API地图缩放显示谷歌搜索后添加的所有标记。在移动地图上,这可能需要一点时间来加载,作为这个骑自行车的应用程序,我更喜欢只显示视口内的结果。我阅读的大多数研究表明,不可能只在视图端口内返回结果。我是否可以在添加标记后保持地图边界不变?如果它只向我显示添加到当前边界的标记,那就太好了,除非只返回一个标记,然后它应该缩放到该标记。因此,搜索像比萨饼这样的一般东西会在当前视口中显示许多比萨饼

  • 建议的解决方案之一是注意在端口80(netstat-ano)上运行的PID,将其关闭并启动Apache,这已经为许多其他人解决了问题。但对我来说,Apache本身运行在端口80上,当我启动服务时,我会得到套接字不可用错误。我试着把端口改成8080或其他,但没有运气。请告诉我我错在哪里? 准确错误消息: C:\Program Files(x86)\Apache Software Foundation

  • 我正在尝试在kubernetes环境中运行Flink作业集群(1.8.1)。我使用此文档使用我的作业jar创建了docker映像。 按照kubefiles创建作业、作业管理器和任务管理器。问题是任务管理器无法连接到作业管理器,并持续崩溃。 调试作业管理器日志时,

  • 我已经为路由设置了Zuul,为服务发现设置了Eureka,效果很好。在设置Eureka之前,我使用了将我的实际服务绑定到,以便只能从Api网关内访问它们。 结合Zuul和Eureka时,不再工作。我无法从网络内部或外部访问实际的RESTendpoint。 应用my Eureka服务发现的属性: 应用my Zuul API网关的属性: 应用我的实际REST服务的属性: 当我移除从REST服务的属性文