直接上代码
def l(list):
def d():
return list
return d
#运行
l = l([1,2,3,4])
print l()
这个情况是正常的。
问题在于d函数为什么不能传入list,然后我现在尝试了一下这个代码:
def l(list):
def d(list):
return list
return d
#运行
l = l([1,2,3,4])
#提示错误
print l()
#正常
print l([1,3,5,7,9])
请问这个怎么解释呢?
我个人理解的是,类似于“继承”的情况,当d函数没有参数传入的情况上,基于父函数的参数,当他需要传参了,就覆盖了???
PHP中文网2017-04-18 10:25:18
看看LEGB原則,就會明白是怎麼回事。
https://zhuanlan.zhihu.com/p/...
l = l([1,2,3,4])
print l() 這個錯誤是你沒有傳參數。
迷茫2017-04-18 10:25:18
原有程式碼中:
def l(list):
def d(list):
return list
return d # <-- 这里是返回的一个要传入一个参数的函数
#运行
l = l([1,2,3,4])
#提示错误
print l() # <-- 这里没有传入参数报错,这里的 l 是 返回的闭包 d
#正常
print l([1,3,5,7,9]) # <-- 这里的 l 已经不是你最初定义的 l 而是 最初 l 中返回的 d
下面的用來說明:你原來程式碼中的 l 指向不同:
def l(list):
def d(list):
return list
return d
#运行
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])
最後說兩點:
不要使用 list
這樣的關鍵字作為變數名稱
不要覆蓋你的變數名稱(除非真的有必要)
PHP中文网2017-04-18 10:25:18
樓主需要理解的是: 作用域
case 1: 函數l回傳函數d的位址,d只做為回傳值,並沒有被呼叫執行.
In [3]: print(l([1,2,3,4]))
<function l.<locals>.d at 0x7f49243ece18>
參數list傳入l,作用域在函數l內,可以被d存取(注意參數是傳給l的,不是d).
若要訪問list.如下調用:
`
〜『 〜
In [2]: print(l([1,2,3,4])())
[1, 2, 3, 4]
相当于:
In [5]: d = l([1,2,3,4]) # 返回d的地址
In [6]: d() #调用d,d没有参数,不需要传参
Out[6]: [1, 2, 3, 4]
case 2: 同样l返回d的地址,但此时返回的函数d需要传参(注意l的参数list和d的参数list是不一样的).
In [8]: d = l([1,2,3,4]) # 返回函数d的地址,参数list此时并没有用到
In [9]: d([5,6,7,8]) # 需要参数的函数d
Out[9]: [5, 6, 7, 8]