我想知道为什么以下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)
在这种情况下,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示例.