2012-11-22 41 views

回答

5

在你的情况下,它是不需要的,因为another_fun嵌套到其他功能,因此它捕获从该函数的局部名字,这包括self。实际上,从some_fun可访问的任何名称也可从another_fun访问。

这就是一些人所说的关闭,编写创建函数的函数很棒。典型的例子是:

def MultiplyBy(x): 
    def M(y): 
     return x * y 
    return M 

Double = MultiplyBy(2) 
Triple = MultiplyBy(3) 

print Double(10), Triple(10) 

这将打印20 30

+0

谢谢,现在我知道什么是闭包 – dtc

2

是的,当你在另一个函数中定义一个函数时,内部函数可以从外部函数读取变量。这不是特定于self。它适用于在所有功能的全部变量:

>>> def outer(): 
...  a = 2 
...  def inner(): 
...   print a 
...  inner() 
>>> outer() 
2 

在Python 2,则不能重新绑定外变量在内部函数(即,可以不做a = 3上述内部inner)。在Python 3中,您可以使用nonlocal声明来执行此操作。

但是,你为什么要这样做?首先,上面的代码甚至不会调用another_fun,所以它所做的并不重要。一般来说,在其他函数中定义函数有点奇怪。这样做肯定有合法的情况(例如装饰者),但在很多情况下,这可能会造成混淆。

+1

实际上,装饰者是合法的,并引起混淆。 – rodrigo

+0

@rodrigo:我没有说这两种情况是相互排斥的:-) – BrenBarn

+0

没有特别的理由这样做,只是碰巧在改变一些代码时偶然发生了。谢谢你的回应 – dtc

相关问题