Python高阶函数中的变量范围

时间:2016-07-22 11:52:12

标签: python higher-order-functions

我在这里查看一些学习资料:http://anandology.com/python-practice-book/functional-programming.html#higher-order-functions-decorators

特别是Memoize部分,其中以下代码用作高阶函数的示例:

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

据我所知,memoize返回的函数无法访问"缓存"变量,因为它超出了" g"。

的定义范围

EG。如果我result_function = memoize(some_function) result_function将不知道任何cache变量,因为它在g函数之外声明,并且仅返回g函数。为什么它可以工作,而不是抛出错误?

2 个答案:

答案 0 :(得分:1)

def memoize():行引入了新范围。 g函数代码'看到'其封闭函数的范围。当然要看看这个问题的答案:Short Description of the Scoping Rules?

所以不:那不是错误!这是一个非常好的功能。

答案 1 :(得分:0)

缓存对象和g(x)对象都具有与memoize函数中的两个对象相同的范围。这意味着g(x)将有权访问缓存,因为它们都是memoize函数中的对象。