python lambda


>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y
現在我問你,a(10)和b(10)返回的結果是什么?如果你認為結果是20和30,那么你就錯了:
>>> a(10)
    30
>>> b(10)
    30
>>>
這其中的奧妙在於lambda表達式中的x是一個自由變量,
在運行時綁定值,而不是定義時就綁定,這跟函數的默認值參數定義是不同的。
因此,在調用這個lambda表達式的時候,x的值是執行時的值。例如:
 >>> x = 15
>>> a(10)
    25
>>> x = 3
>>> a(10)
    13
如果你想讓某個匿名函數在定義時就捕獲到值,可以將那個參數值定義成默認參數即可,就像下面這樣:
    >>> x = 10
    >>> a = lambda y, x=x: x + y
    >>> x = 20
    >>> b = lambda y, x=x: x + y
    >>> a(10)
    20
    >>> b(10)
    30
    >>>
在這里列出來的問題是新手很容易犯的錯誤,有些新手可能會不恰當的使用lambda表達式。
比如,通過在一個循環或列表推導中創建一個lambda表達式列表,並期望函數能在定義時就記住每次的迭代值。例如:
    >>> funcs = [lambda x: x+n for n in range(5)]
    >>> for f in funcs:
    ... print(f(0))
    ...
    4
    4
    4
    4
    4
    >>>
但是實際效果是運行是n的值為迭代的最后一個值。現在我們用另一種方式修改一下:
    >>> funcs = [lambda x, n=n: x+n for n in range(5)]
    >>> for f in funcs:
    ... print(f(0))
    ...
    0
    1
    2
    3
    4
    >>>
通過使用函數默認值參數形式,lambda函數在定義時就能綁定到值。

注意:
lambda 的參數
在運行時綁定值,而不是定義時就綁定,這跟函數的默認值參數定義是不同的。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM