以下函數用作存儲已計算值結果的裝飾器。 (錯誤),其cache
不必是函數對象的屬性,我意識到在裝飾函數的多個調用中,數據如何保持持久性?
def cached(f):
f.cache = {}
def _cachedf(*args):
if args not in f.cache:
f.cache[args] = f(*args)
return f.cache[args]
return _cachedf
:如果參數之前已經計算出,該函數將返回存儲在cache
字典中的價值。作爲事實的問題,下面的代碼工作,以及:
def cached(f):
cache = {} # <---- not an attribute this time!
def _cachedf(*args):
if args not in cache:
cache[args] = f(*args)
return cache[args]
return _cachedf
我有一個很難理解怎麼能cache
對象是跨多個調用持久。我嘗試多次調用多個緩存函數,但無法找到任何衝突或問題。
任何人都可以請幫我理解cache
變量在_cachedf
函數返回後仍然存在嗎?
非常感謝您的解釋,您的編輯使事情變得非常清楚。我想知道,爲了學習(C)Python的內部機制,是否可以通過檢查或類似的方式訪問您在最後一段中提到的「單元格」? – rahmu 2012-08-06 15:27:58
@rahmu:我解釋了一個錯誤(不會變化太大)。不幸的是,這些單元對於Python代碼來說是完全透明的,並且總是被它們引用的對象替換,所以它們不能被檢查。 – 2012-08-06 16:13:08