[英]Why is a line in this python function necessary? (memoized recursion)
我從Peter Norvig的網站上獲得了以下代碼片段; 它是一個裝飾器,用於在函數調用上啟用memoization(緩存對函數的先前調用,以將指數遞歸更改為簡單的動態程序)。
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
代碼工作正常,但我想知道為什么倒數第二行是必要的。 這顯然是我對Python知識的一個空白,但刪除線和運行簡單的fibonacci函數,它似乎仍然有效。 這是否與同時記憶多個功能有關? 為什么fmemo的成員變量被稱為備忘錄(假設它不是一個尷尬的巧合)?
謝謝!
由於函數就像其他任何東西一樣,您可以在它們上設置屬性。 看到:
>>> def foo(): pass
>>> foo.x = 1
>>> foo.x
1
第二行設置值的內部緩存作為函數對象的屬性,從而暴露它。 這意味着您可以使用記憶功能並隨意調整其緩存,而無需調用它。 這可能很方便。
例:
>>> @memo
... def id(x): return x
>>> id(1)
1
>>> id(2)
2
>>> id.memo
{(2,): 2, (1,): 1}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.