我正在研究 lambda 函式,我遇到了這個代碼示例:
def myfunc(n):
return lambda a : a * n
tripler = myfunc(3)
print(tripler(10)) # Output: 30
我知道當將三重分配給 myfunc 函式的回傳值時,3 的值作為引數傳遞,并在函式內表示為“n”。但是 lambda 使用標記為“a”的系結變數。所以在這一點上,忽略最后的列印行,我不確定“a”是如何被考慮在內的。當我運行此代碼時,我沒有收到任何錯誤。
我有興趣了解如何處理此代碼以及它如何得出結論而不會產生錯誤。
uj5u.com熱心網友回復:
的回傳值myfunc是一個閉包,它保留對傳遞給 的引數的參考myfunc。
>>> x = myfunc(3)
>>> x.__closure__[0].cell_contents
3
當您呼叫 時x,將使用該值。
>>> x(10) # (lambda a: a * n)(10), with n == 3
30
您可以在為 生成的位元組碼中看到這一點x:
>>> import dis
>>> dis.dis(x)
2 0 LOAD_FAST 0 (a)
2 LOAD_DEREF 0 (n)
4 BINARY_MULTIPLY
6 RETURN_VALUE
LOAD_FAST參考區域變數(在這種情況下,唯一的區域變數是引數a),而LOAD_DEREF參考閉包。引數0是存盤在 中的元組的索引x.__closure__。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400218.html
