我不能减少N,但我可以在评估逻辑时使用它。有人可以解释一下吗?

时间:2015-08-21 00:23:23

标签: python

增量定义为:

def increment(x):
    return x + 1

以下工作,并吐出8的结果:

def repeated(f, n): 
    def h(x):
        counter = 0
        while counter < n:
            x = f(x)
            counter += 1
        return x
    return h
addthree = repeated(increment,3)
addthree(5)

以下代码错误并告诉我在分配之前我正在引用n:

def repeated3(f,n): 
    def h(x):
        total=0
        while n != 0:
            total = f(x) + total
            n -= 1
        return total
    return h
addthree = repeated(increment,3)
addthree(5)

为什么当我尝试递减n时错误抛出,即使我被允许在它之前的逻辑语句中使用它?

3 个答案:

答案 0 :(得分:3)

当函数嵌套时,在内部函数中使用外部函数的参数或变量称为闭包

Python closures are read only

因此,如果要使用递减循环,则需要将repeatition参数复制到可写的局部变量。

In [10]: def r(f,n):
   ....:     def h(x):
   ....:         total = 0
   ....:         m = n
   ....:         while m!=0:
   ....:             total += f(x)
   ....:             m -= 1
   ....:         return total
   ....:     return h
   ....: 

In [11]: r(increment, 3)(0)
Out[11]: 3

这不是以前发布的递增repeated()函数代码的问题,因为虽然重复参数n也是一个闭包,但它在比较中只读,而不是写入

答案 1 :(得分:1)

第一个函数的作用是因为您没有使用nn -= 1分配/变换为新值,而是将n分配给新值,因此您要创建一个局部变量{ {1}}未使用外部函数中的n,因此当您在本地范围内使用n时,local variable 'n' referenced before assignment未定义n错误。

在python3中,您可以使用while n != 0:关键字:

nonlocal

如果您使用的是python2,可以重新分配一个新变量以指向def repeated3(f, n): def h(x): nonlocal n total = 0 while n != 0: total = f(x) + total n -= 1 return total return h 并使用它或使用dict:

n

你也可以把它变成一个函数属性:

def repeated3(f,n):
    n = {"n":n}
    def h(x):
        total = 0
        while n["n"] != 0:
            total = f(x) + total
            n["n"] -= 1
        return total
    return h
addthree = repeated3(increment,3)
addthree(5)

还有许多其他的解决方法,但重点是你可以阅读但不改变闭包变量,在本地范围内创建def repeated3(f,n): repeated3.n = n def h(x): total = 0 while repeated3.n != 0: total = f(x) + total repeated3.n -= 1 return total return h addthree = repeated3(increment,3) 会导致n成为局部变量,这意味着{ {1}}正在本地范围内查找n,因此您获得了n

答案 2 :(得分:0)

你需要将'n'传递给h(x),使其成为本地的。所以你有h(x,n = n)。