python嵌套函數(shù)作用域怎么解釋
問題描述
直接上代碼
def l(list): def d():return list return d #運(yùn)行l(wèi) = l([1,2,3,4])print l()
這個(gè)情況是正常的。
問題在于d函數(shù)為什么不能傳入list,然后我現(xiàn)在嘗試了一下這個(gè)代碼:
def l(list): def d(list):return list return d #運(yùn)行l(wèi) = l([1,2,3,4])#提示錯誤print l()#正常print l([1,3,5,7,9])
請問這個(gè)怎么解釋呢?我個(gè)人理解的是,類似于“繼承”的情況,當(dāng)d函數(shù)沒有參數(shù)傳入的情況上,基于父函數(shù)的參數(shù),當(dāng)他需要傳參了,就覆蓋了???
問題解答
回答1:看看LEGB原則,就會明白是怎么回事。https://zhuanlan.zhihu.com/p/...
運(yùn)行l = l([1,2,3,4])
提示錯誤print l() 這個(gè)錯誤是你沒有傳參數(shù)。
回答2:原有代碼中:
def l(list): def d(list):return list return d # <-- 這里是返回的一個(gè)要傳入一個(gè)參數(shù)的函數(shù) #運(yùn)行l(wèi) = l([1,2,3,4])#提示錯誤print l() # <-- 這里沒有傳入?yún)?shù)報(bào)錯,這里的 l 是 返回的閉包 d#正常print l([1,3,5,7,9]) # <-- 這里的 l 已經(jīng)不是你最初定義的 l 而是 最初 l 中返回的 d
下面的用于說明:你原來代碼中的 l 指向不同:
def l(list): def d(list):return list return d #運(yùn)行print ’id(l) is {}’.format(id(l))l = l([1,2,3,4])#提示錯誤# print l()#正常print ’id(l) is {}’.format(id(l))print l([1,3,5,7,9])
代碼寫成這樣你可能就理解了:
def l(_list): def d(_l):return _list + _l return d a = l([1,2,3,4])print a([1])
最后說兩點(diǎn):
不要使用 list 這樣的關(guān)鍵字作為變量名
不要覆蓋你的變量名(除非真的有必要)
回答3:樓主需要理解的是: 作用域
case 1: 函數(shù)l返回函數(shù)d的地址,d只做為返回值,并沒有被調(diào)用執(zhí)行.
In [3]: print(l([1,2,3,4]))<function l.<locals>.d at 0x7f49243ece18>
參數(shù)list傳入l,作用域在函數(shù)l內(nèi),可以被d訪問(注意參數(shù)是傳給l的,不是d). 如果要訪問list.如下調(diào)用: `
In [2]: print(l([1,2,3,4])()) [1, 2, 3, 4]
相當(dāng)于:
In [5]: d = l([1,2,3,4]) # 返回d的地址In [6]: d()#調(diào)用d,d沒有參數(shù),不需要傳參 Out[6]: [1, 2, 3, 4]
case 2: 同樣l返回d的地址,但此時(shí)返回的函數(shù)d需要傳參(注意l的參數(shù)list和d的參數(shù)list是不一樣的).
In [8]: d = l([1,2,3,4])# 返回函數(shù)d的地址,參數(shù)list此時(shí)并沒有用到In [9]: d([5,6,7,8])# 需要參數(shù)的函數(shù)d Out[9]: [5, 6, 7, 8]
相關(guān)文章:
1. mysql - 這條聯(lián)合sql語句哪里錯了2. mysql優(yōu)化 - 關(guān)于mysql分區(qū)3. 請教各位大佬,瀏覽器點(diǎn) 提交實(shí)例為什么沒有反應(yīng)4. css3 - 這個(gè)形狀使用CSS怎么寫出來?5. java - Atom中文問題6. javascript - ionic2 input autofocus 電腦成功,iOS手機(jī)鍵盤不彈出7. 如何分別在Windows下用Winform項(xiàng)模板+C#,在MacOSX下用Cocos Application項(xiàng)目模板+Objective-C實(shí)現(xiàn)一個(gè)制作游戲的空的黑窗口?8. javascript - 為什么這個(gè)點(diǎn)擊事件需要點(diǎn)擊兩次才有效果9. angular.js - 百度支持_escaped_fragment_嗎?10. java - MySQL中,使用聚合函數(shù)+for update會鎖表嗎?
