这是一个Python闭包吗? (或者,为什么这段代码有用?)

时间:2011-03-16 10:38:04

标签: python closures

我想知道以下Python代码的工作原理:

def sum(a, b):
    return a+b+c
c=3
print sum(1,2)
# result: 6

我原本期望编译错误 当变量sum不是时,我们如何定义c函数(我会说c不在sum函数的范围内)?

这就是他们所谓的闭包吗?

正如我所理解的那样,变量必须已经被“提及”,就像在下面的代码片段中那样(从this site复制)。这里x已经在inc()函数的定义之上提到了def makeInc(x): def inc(y): # x is "closed" in the definition of inc return y + x (尽管没有填写')。

{{1}}

3 个答案:

答案 0 :(得分:6)

在这种情况下,在globals表中找到c。如果您尝试调用sum(1,2)并且在函数的作用域中找不到c,或者它的父作用域(全局作用域),则会出现NameError异常。

虽然这类似于闭包,但访问函数体内的全局变量通常是不受欢迎的,因为它使调试变得更加困难。 python中一个命名闭包的更好例子(来自维基百科):

def outer():
    y = 0
    def inner():
        nonlocal y
        y += 1
        return y
    return inner

f = outer() 
print(f(), f(), f()) #prints 1 2 3

有关更多详细信息,请参阅关于闭包的维基百科条目:Python example

答案 1 :(得分:4)

如果在调用函数时未定义变量,Python将抛出错误 在定义Sum时,请致电c

答案 2 :(得分:3)

Python在调用之前不会计算sum的主体。由于c是在调用sum之前定义的,因此可以使用sum。