求助求助,閉包和匿名兩節課中的問題
def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????fs.append(lambda?i=i:?i*i) ????return?fs f1,?f2,?f3?=?count() print?f1(),?f2(),?f3() #這個代碼可以正確的顯示出1,4,9 def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????fs.append(lambda?a=i:?i*i) ????return?fs f1,?f2,?f3?=?count() print?f1(),?f2(),?f3() #然而這個代碼只能顯示出9,9,9 def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????fs.append(lambda?i:?i*i) ????return?fs f1,?f2,?f3?=?count() print?f1(),?f2(),?f3() #這個代碼會報錯 誰能解釋下這是為什么呢?
2015-12-04
初學,不知道解釋的對不對啊
第一個問題:
fs.append(lambda?i=i:?i*i) 相當于 fs.append(lambda j=i: j*j)
(lambda?i=i:?i*i)中的第一個 i 是lambda自己聲明的局部變量 , 會屏蔽掉外部的 i 變量值。
第二個問題:
fs.append(lambda?a=i:?i*i) 相當于 fs.append(lambda : i*i)
(lambda?a=i:?i*i) 中的 i是引用外部變量 ,所以會發生變化,閉包要求不是不能引用外部會發生變化的變量么
第三個問題:
fs.append(lambda?i:?i*i)? 中相當于
def f(i):
??? return i*i
fs1.append(f)
然后后面的 print?f1(),?f2(),?f3() 函數中都沒有傳入參數,改為print?f1(1),?f2(2),?f3(3) 就不會報錯
fs.append(lambda?i:?i*i)? 中的 i 是lambda自己聲明的局部變量,會屏蔽外部的變量 i。
?