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

Rab*_*ski 0 python closures

我想知道为什么以下Python代码工作:

def sum(a, b):
    return a+b+c
c=3
print sum(1,2)
# result: 6
Run Code Online (Sandbox Code Playgroud)

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

这是他们所说的关闭吗?

正如我所理解的那样,变量必须已被"提及",如下面的代码片段(从此站点复制).这里x已经提到了(尽管没有"填写")inc()函数的定义.

def makeInc(x):
  def inc(y):
     # x is "closed" in the definition of inc
     return y + x
Run Code Online (Sandbox Code Playgroud)

Mat*_*kel 6

在这种情况下,c可以在globals表中找到.如果您尝试调用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
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅关于闭包的Wikipedia条目:Python示例.

  • Python使用2遍编译器 - 它在第一次传递时看到外部定义,因此它知道如何在第二次传递时将其挂起.如果你试图在`y`的定义之前调用*内部函数,你会得到一个例外. (2认同)