【问题标题】:The purpose of lambda x: lambda: xlambda x: lambda: x 的目的
【发布时间】:2018-11-04 07:04:59
【问题描述】:

我正在阅读 byterun(一个 python python 解释器)的代码,我无法理解下面关于闭包和 lambda 的内容:

def make_cell(value):
    fn = (lambda x: lambda: x)(value) 
    return fn.__closure__[0]

函数在倒数第二行调用:

class Function(object):
__slots__ = [... omit ...]

def __init__(self, name, code, globs, defaults, closure, vm):
    self._vm = vm
    self.func_code = code  
    self.func_name = self.__name__ = name or code.co_name  
    self.func_defaults = tuple(defaults)  
    self.func_globals = globs  
    self.func_locals = self._vm.frame.f_locals  
    self.__dict__ = {}  
    self.func_closure = closure  
    self.__doc__ = code.co_consts[0] if code.co_consts else None  
    kw = {
        'argdefs': self.func_defaults,
    }
    if closure:
        kw['closure'] = tuple(make_cell(0) for _ in closure)
    self._func = types.FunctionType(code, globs, **kw)  

函数的目的是什么?它是如何工作的(尤其是 2 lambda)?

【问题讨论】:

  • 鉴于 3 行上下文,这不是很清楚。链接到调用make_cell的源代码?

标签: python lambda closures interpreter


【解决方案1】:

这个lambda x: lambda: x 构造的目的是创建一个closure cell object,Python 用来实现闭包变量的对象。嵌套的lambda: x 使用来自外部lambdax 变量,因此Python 需要为x 变量创建一个闭包单元。调用外部 lambda:

(lambda x: lambda: x)(value)

为内部lambda 创建一个函数对象,其中x 变量持有value 的闭包单元和__closure__ 访问:

return fn.__closure__[0]

访问函数对象的闭包变量元组以检索并返回闭包单元。

【讨论】:

  • 并且函数被调用:tuple(make_cell(0) for _ inclosure)。它是否返回参数 0 ?还是一头雾水。 :(
  • @kaka4NERV: fn 如果调用返回 0,但会返回包含该 0 的单元格。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多