首頁>Program>source

以下測試失败:

#!/usr/bin/env python
def f(*args):
    """
    >>> t = 1, -1
    >>> f(*map(lambda i: lambda: i, t))
    [1, -1]
    >>> f(*(lambda: i for i in t)) # -> [-1, -1]
    [1, -1]
    >>> f(*[lambda: i for i in t]) # -> [-1, -1]
    [1, -1]
    """
    alist = [a() for a in args]
    print(alist)
if __name__ == '__main__':
    import doctest; doctest.testmod()

換句话說:

>>> t = 1, -1
>>> args = []
>>> for i in t:
...   args.append(lambda: i)
...
>>> map(lambda a: a(), args)
[-1, -1]
>>> args = []
>>> for i in t:
...   args.append((lambda i: lambda: i)(i))
...
>>> map(lambda a: a(), args)
[1, -1]
>>> args = []
>>> for i in t:
...   args.append(lambda i=i: i)
...
>>> map(lambda a: a(), args)
[1, -1]
最新回復
  • 5月前
    1 #

    它们是不同的,因為 i的值 生成器表達式和list comp中的值都是惰性計算的,即在 f中呼叫匿名函式時 .
    那時, i 如果 t繫結到最後一个值 ,即-1。

    所以基本上,這就是列表理解的功能(對於genexp也是如此):

    x = []
    i = 1 # 1. from t
    x.append(lambda: i)
    i = -1 # 2. from t
    x.append(lambda: i)
    

    現在,lambda携帶一个引用 i的闭合 ,但 i 在這两種情况下都繫結為-1,因為這是它被分配给的最後一个值。

    如果要確保lambda收到 i的当前值 ,做

    f(*[lambda u=i: u for i in t])
    

    這樣,您就可以對 i进行評估 在建立封包時。

    Edit :生成器表達式与列表理解之間有一个區別:後者將迴圈變數洩漏到週圍的範圍中。

  • 5月前
    2 #

    lambda捕获變數,而不是值,因此捕获代碼

    lambda : i
    

    將始终返迴值i為 currently 必然要在關闭.到呼叫它時,此值已設置為-1。

    要获得所需的內容,您需要通過以下方式捕获建立lambda時的實際繫結:

    >>> f(*(lambda i=i: i for i in t)) # -> [-1, -1]
    [1, -1]
    >>> f(*[lambda i=i: i for i in t]) # -> [-1, -1]
    [1, -1]
    

  • 5月前
    3 #

    表達式 f = lambda: i 等效於:

    def f():
        return i
    

    表達 g = lambda i=i: i 等效於:

    def g(i=i):
        return i
    

    i 在第一種情况下為自由變數,在第二種情况下為函式引數繫結,即在這種情况下為區域性變數.預設引數的值在函式定義時进行評估.

    Generator表達式是最接近的範圍(其中 ii定義) 在 lambda中的名字 表達,因此 i 在该塊中得到解決:

    f(*(lambda: i for i in (1, -1)) # -> [-1, -1]
    

    ilambda i: ...的區域性變數 塊,因此它引用的物件在该塊中定義:

    f(*map(lambda i: lambda: i, (1,-1))) # -> [1, -1]
    

相似問題

  • excel:執行時錯誤'1004':物件'_Global'的方法'Range'失败
  • java:如何在Swing中為JTable提供分頁支援?