【问题标题】:failed to wrap function with lambda [duplicate]无法用 lambda 包装函数 [重复]
【发布时间】:2015-10-11 19:17:17
【问题描述】:

我想用指定的参数包装一个函数,比如functools.partial,但它没有按预期工作:

source_codes = (0, 1, 2)

def callback(source, *args):
    print 'callback from source: ', source

funcs = []
for source in source_codes:
    funcs.append(lambda *args: callback(source, *args))

for i, func in enumerate(funcs):
    print 'source expected: ', i
    func()
    print

输出:

source expected:  0
callback from source:  2

source expected:  1
callback from source:  2

source expected:  2
callback from source:  2

但是……我想要的是:

source expected:  0
callback from source:  0

source expected:  1
callback from source:  1

source expected:  2
callback from source:  2

如果我使用functools.partial,我知道它可以工作,但我想知道我的代码中的真正问题... lambda 包装器是否使用全局变量source?

【问题讨论】:

    标签: python lambda


    【解决方案1】:

    您的代码中的问题是 lambda 表达式在被调用之前不会被评估。

    然后当它被调用时,它使用source 的最新值。它不会在创建 lambda 时绑定 source 的值。

    显示此行为的示例代码 -

    >>> y = lambda: z
    >>> z = 0
    >>> y()
    0
    >>> z  = 1
    >>> y()
    1
    

    【讨论】:

      【解决方案2】:

      partial 已经“冻结”了您传递给他的函数参数和/或关键字,因此您可以简单地消除 lambda 表达式:

      source_codes = (0, 1, 2)
      
      def callback(source, *args):
          print 'callback from source: ', source
      
      funcs = []
      for source in source_codes:
          funcs.append(partial(callback, source))
          source = 30 # don't have any effects over partial function.
      
      for i, func in enumerate(funcs):
          print 'source expected: ', i
          func()
          print
      

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2023-03-03
        • 2016-09-21
        相关资源
        最近更新 更多