關於 [lambda x: x*i for i in range(4)] 理解

來源:互聯網
上載者:User

標籤:nbsp   list   star   引用   color   pen   怎麼   編程   pre   

題目:

lst = [lambda x: x*i for i in range(4)]res = [m(2) for m in lst]print res

實際輸出:[6, 6, 6, 6]

想要輸出 [0, 2, 4, 6] 應該怎麼改?如下:

lst = [lambda x, i=i: x*i for i in range(4)]res = [m(2) for m in lst]print res

這個問題涉及到了Python的閉包及延時綁定的知識(Python範圍)。

在Python核心編程裡,閉包的定義如下:

如果在一個內建函式裡,對外部範圍(但不是在全域範圍)的變數進行引用,那麼內建函式就被認定是閉包。

總結為三點:

1、是一個內嵌函數

2、對外部函數變數引用

3、外部函數返回內嵌函數

簡單的閉包例子:

def counter(start_at=0):    count = [start_at]    def incr():        count[0] += 1        return count[0]    return incr

上面的那道題,可以寫成這樣:

def func():    fun_list = []    for i in range(4):        def foo(x):            return x*i        fun_list.append(foo)    return fun_listfor m in func():  print m(2)

func()是一個包含四個函數的列表:

[<function func at 0x00000000021CE9E8>, <function func at 0x00000000021CEA58>, <function func at 0x00000000021CEAC8>, <function func at 0x00000000021CEB38>]

當我們執行 m(2) 時,運行到foo()內建函式,發現變數 i 並不是foo()中的變數,於是就到外部函數func中尋找變數 i ,但此時外部的 for 已經迴圈完畢,最後的 i =3 。所以,每次

執行m(2),i 的值都是 3 ,因此,最終結果會是 [6, 6, 6, 6] 。

當在foo()中添加 i=i 後,即:

def func():    fun_list = []    for i in range(4):        def foo(x, i=i):            return x*i        fun_list.append(foo)    return fun_listfor m in func():  print m(2)

這樣的話,for迴圈執行時,就已經把 i(0, 1, 2, 3) 的值傳給了foo()函數,此時的 i 已經是foo()函數的內部變數,運行到foo()函數時,就不會到外部函數尋找變數 i ,直接運行

x*i(0, 1, 2, 3),因此最終結果會是 [0, 2, 4, 6] 。

 

關於 [lambda x: x*i for i in range(4)] 理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.