2016-07-22 85 views
0

我期待在一些學習材料這裏:http://anandology.com/python-practice-book/functional-programming.html#higher-order-functions-decorators變量範圍在Python高階函數

特別地,Memoize部分,其中下面的代碼被用作例如用於高階函數:

def memoize(f): 
    cache = {} 
    def g(x): 
     if x not in cache: 
      cache[x] = f(x) 
     return cache[x] 
    return g 

這是我的理解是memoize返回的函數不能訪問「緩存」變量,因爲它超出了「g」的定義範圍。

例如,如果我做result_function = memoize(some_function)result_function將不知道任何cache變量,因爲它是在g函數之外聲明的並且僅返回g函數。爲什麼它能夠工作,而不是拋出錯誤?

+2

我覺得你要找的詞是'閉包'。 – polku

+0

它的工作原理是「超出範圍」並不意味着您無權訪問它。更高範圍內的每個變量都綁定到在該範圍內定義的函數(並通過遞歸到其子範圍),除非這些函數實際上不使用它們(在這種情況下,解釋器將簡單地將其收集)。類似的(但不完全一樣),你可以在任何函數中使用全局變量。 – freakish

回答

0

緩存對象和g(x)對象都具有與memoize函數中的兩個對象相同的作用域。這意味着g(x)將有權訪問緩存,因爲它們都是memoize函數中的對象。

1

def memoize():這一行介紹了一個新的範圍。 g功能代碼'看到'其封閉功能的範圍。當然,請看看這個問題的答案:Short Description of the Scoping Rules?

所以不:這不是一個錯誤!這是一個非常好的功能。