def f(x)。
return x
f = lambda : f(5)
f()
=> 回溯(最近一次呼叫)。
檔案"<input>",行1,in<module>
檔案"<input>",第4,in <lambda>。
TypeError: <lambda>()需要0個位置引數,但1被賦予了
我可以直觀地看到為什么這不起作用......它是一種回圈參考。具體來說,它違反了 Python 中的什么規則?
uj5u.com熱心網友回復:
好吧,你重寫了函式名。在lambda行:
f = lambda : f(5)
它變成了一個遞回,它做了f(5),它呼叫了自己。它沒有反復呼叫自己(遞回)的唯一原因是你使用了lambda:,它不需要引數,所以如果你這樣做了:
f = lambda: f()
你會得到一個RecursionError。
一個lambda本質上是一個函式,那個lambda可以被翻譯成:
def f()。
return f()
uj5u.com熱心網友回復:
f里面的lambda: f(5)是一個free變數。(它沒有被定義在函式的范圍內;它的值是在函式范圍之外找到的)。f的當前值并不用于定義所產生的函式;f的值將在函式被呼叫時被查找,并且f的值可以(在這種情況下)在函式被定義和函式被呼叫之間發生變化。
當你最終呼叫f()時,f的值是同一個函式,但是現在你試圖用original,而不是當前的,與f名稱系結的函式所期望的引數來呼叫它,結果是一個TypeError。
uj5u.com熱心網友回復:
除了 @U12-Forward 發布的內容之外,你創建一個回圈參考的原因是lambda的后期系結。當它呼叫f(5)時,它已經在參考自己了。
如果你的目的是呼叫你原來的f(),你可以通過以下方式強制系結:
f = lambda f=f: f(5)
而呼叫f()將回傳5,因為這是原f()的作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321122.html
標籤:
上一篇:如何通過pythonpandas從一個特定的點反向計算天數?
下一篇:快取的雪崩,擊穿,穿透
