代码之家  ›  专栏  ›  技术社区  ›  rst

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

  •  1
  • rst  · 技术社区  · 6 年前

    index = 1
    test = lambda t : t[index]+1
    index = 0
    print(test([5, 0]))
    

    结果是6,我希望结果是1。如何使lambda表达式中的索引保持静态而不进行写入 t[1]+1

    4 回复  |  直到 6 年前
        1
  •  1
  •   Eugene Yarmash    6 年前

    Python的闭包是 后期装订

    要避免后期绑定效果,可以使用带有默认arg的lambda:

    index = 1
    test = lambda t, index=index: t[index]+1  # binds index at definition time
    index = 0
    print(test([5, 0]))  # 1
    
        2
  •  1
  •   bruno desthuilliers    6 年前

    index 既不是参数也不是局部变量 test() 因此它确实被解析为一个非局部的(+>它在封闭的作用域中查找)。

    指数 test 定义时间:

    index = 1
    test = lambda t, _index=index: t[_index]+1
    index = 0
    print(test([5, 0])) 
    
        3
  •  0
  •   ikkuh    6 年前

    lambda 返回 λ :

    test = (lambda index: lambda t: t[index] + 1)(index)
    

    index 变量是返回的lambda函数的局部变量。

        4
  •  0
  •   jpp    6 年前

    你可以用 operator.itemgetter 创建一个可调用对象来提取 列表中的第项:

    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